List&Tuple
List是一个可变序列类型。因此,您可以通过添加或删除元素来更改给定的列表。元组是不变序列类型。你不能换一个元组。所以你必须创建一个新的。
- List
- 创建:listTmp = [] , listTmp = [‘listtmp’, 2017, 2018, 2019]
- 访问:通过下标进行访问(和字符串同样可以使用切片),listTmp[0] , listTmp[1,3]
- 增加:append()、或者通过下标进行组合新增或删除等操作。listTmp.append(2020) # ‘listtmp’, 2017, 2018, 2019, 2020
- 删除:listTmp.pop()(该方法默认删除最后一个)、 listTmp.remove(2018)(移除列表中某个值的第一个匹配项)、 del listTmp2
listTmp = [2, 5, 7, '2019', '2010', 'ABCD'] print(listTmp.pop()) listTmp.remove(7) print(listTmp) del listTmp[2] print(listTmp) ''' ABCD [2, 5, '2019', '2010'] [2, 5, '2010'] '''
- Tuple
- 创建:tupleTmp = () , tupleTmp = (‘listtmp’, 2017, 2018, 2019)
- 访问:通过下标进行访问(和字符串同样可以使用切片),tupleTmp[0] , tupleTmp[1,3]
- 增加:元组中的元素值是不允许修改的,但我们可以对元组进行连接组合。
- 删除:元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组。
tupleTmp = ('loak', 2017, 2018, 2019) print(tupleTmp[0]) tupleTest = 1 newTuple = tupleTmp + (tupleTest,) # 元组中的元素只能连接组合进行增加 print(newTuple)' del tupleTmp
列表和元组的运算
- 列表
列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。
Python 表达式 | 结果 | 描述 |
---|---|---|
len([1, 2, 3]) | 3 | 长度 |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 组合 |
[‘Hi!’] * 4 | [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] | 重复 |
3 in [1, 2, 3] | True | 元素是否存在于列表中 |
for x in [1, 2, 3]: print(x, end=" ") | 1 2 3 | 迭代 |
- 元组
与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。
Python 表达式 | 结果 | 描述 |
---|---|---|
len((1, 2, 3)) | 3 | 计算元素个数 |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | 连接 |
(‘Hi!’,) * 4 | (‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’) | 复制 |
3 in (1, 2, 3) | True | 元素是否存在 |
for x in (1, 2, 3): print (x,) | 1 2 3 | 迭代 |
内置函数
- 列表
序号 | 函数 | 描述 |
---|---|---|
1 | len(list) | 列表元素个数 |
2 | max(list)、min(list) | 返回列表元素最大、最小值 |
3 | list(seq) | 将元组转换为列表 |
4 | list.append(obj) | 在列表末尾添加新的对象 |
5 | list.count() | 统计某个元素在列表中出现的次数 |
6 | list.extend(seq) | 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
7 | list.index(obj) | 从列表中找出某个值第一个匹配项的索引位置 |
8 | list.insert(index, obj) | 将对象插入列表 |
9 | list.pop([index=-1]) | 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
10 | list.remove(obj) | 移除列表中某个值的第一个匹配项 |
11 | list.reverse() | 反向列表中元素 |
12 | list.sort( key=None, reverse=False) | 对原列表进行排序 |
13 | list.clear() | 清空列表 |
14 | list.copy() | 复制列表 |
- 元组
序号 | 函数 | 描述 |
---|---|---|
1 | len(tuple) | 计算元组元素个数 |
2 | max(tuple)、min(tuple) | 返回元组元素最大、最小小值 |
3 | tuple(seq) | 将列表转换为元组 |
关于列表和元组的深浅复制
- Python对象和变量的管理
Python没有C语言中的变量。在C语言中,变量不止是个名字,它是字节集合并真实存在于内存某个位置上。而在Python中,变量仅仅是指向对象的标签。a = [1, 2, 3] # 表示我们创建了一个指引指向列表[1, 2, 3],但是a不是列表 b = a # 此时并没有复制a所指引的列表。我们只是创建了一个新的标签b,然后将其指向a所指向的列表。如果修改a,那你就同时修改了b,因为它们指向同一个列表。 # 可以使用内建函数id()可以返回对象的唯一id。该id是对象的内存地址。 c = [] print(id(a)) print(id(b)) print(id(c)) '''输出: 10784000 10784000 10304448 '''
-
五种复制方式的比较
import copy a = [[1], 2, 3] b = a[:] c = list(a) d = a * 1 e = copy.copy(a) f = copy.deepcopy(a) a[0].append(4) print('a ', id(a), a) print('a[:] ', id(b), b) print('list(a) ', id(c), c) print('a * 1 ', id(d), d) print('copy.copy(a) ', id(e), e) print('copy.deepcopy(a) ', id(f), f) ''' a 9303824 [[1, 4], 2, 3] a[:] 9304864 [[1, 4], 2, 3] list(a) 9004416 [[1, 4], 2, 3] a * 1 9304824 [[1, 4], 2, 3] copy.copy(a) 9304784 [[1, 4], 2, 3] copy.deepcopy(a) 9304744 [[1], 2, 3] '''
从以上可以看出,使用 a[:], list(a), a*1, copy.copy(a)四种方式复制列表结果都可以得到一个新的列表,但是如果列表中含有列表,所有b, c, d, e四个新列表的子列表都是指引到同一个对象上。只有使用copy.deepcopy(a)方法得到的新列表f才是包括子列表在内的完全复制。
-
深复制
-
列表深复制:a[:]、list(list)、copy.deepcopy(a)
上例为浅复制,如果需要深复制a指引的列表。我们必须创建新的列表,然后使用变量来指引它。可以使用切片a[:]或者list(list)来实现全复制。当使用copy.copy(a)时,如果a中嵌套有列表,则嵌套的列表是浅复制。a = [1, 2, 3] b = a[:] # b = list(a) # import copy # b = copy.deepcopy(a) print(id(a)) # 10652928 print(id(b)) # 10653408 使用a[:]已成功复制
-
其他注意事项
还接受生成器。切片笔记法不适用于生成器,因为生成器是不可更改。因此不能generator[0]。>>> generator = (x * 3 for x in range(4)) >>> list(generator) [0, 3, 6, 9]
百分之九十的切片标记法都可以被list()代替。下次你看见[:]的时候试试使用list()替代,这样可以让代码更加可读。
复制内容参照文章
-
个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python基础(二)—列表和元组