文章目录
27.列表元素的增加
当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这 个特点涉及列表元素的大量移动,效率较低。除非必要,我们一般只在列表的尾部添加元素 或删除元素,这会大大提高列表的操作效率。
append()
方法 (推荐使用)
原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。
In [1]: a=[10,20]
In [2]: a
Out[2]: [10, 20]
In [3]: a.append(80)
In [4]: a
Out[4]: [10, 20, 80]
In [6]: a.append([50,60])
# 和 extend 函数 不一样。 这个 是 把 [50,60] 当做一个元素 添加 到列表 尾部
In [7]: a
Out[7]: [10, 20, 80, [50, 60]]
+
运算符操作 (对于操作大量元素不建议使用。)
并不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次 复制到新的列表对象中。
这样,会涉及大量的复制操作,对于操作大量元素不建议使用。
创建很多新的对象(比较消耗内存)
列表合并:少量元素的话可以这样执行
因为这样用比较简便
In [8]: a=[10,20]
In [9]: id(a)
Out[9]: 87734672
In [10]: a=a+[50]
In [11]: a
Out[11]: [10, 20, 50]
In [12]: id(a)
Out[12]: 128420680
通过如上测试,我们发现变量a 的地址发生了变化。也就是创建了新的列表对象。
extend()
方法 相比+
运算符 更推荐这种方法
将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。
In [13]: a=[10,20]
In [14]: id(a)
Out[14]: 186343376
In [15]: a.extend([50,60])
In [16]: a
Out[16]: [10, 20, 50, 60]
In [17]: id(a)
Out[17]: 186343376 # id 还是 和之前一样。
# 这种方式 和 append 是有区别 的
# 可以看到 [50,60] 不是作为 一个元素 添加进去的。
# 而是 一个一个添加进去。
# 再举一个例子
In [18]: a.extend("abc")
In [19]: a
Out[19]: [10, 20, 50, 60, 'a', 'b', 'c'] # 这种效果 不是我要的 。 当然某些情况下 是我们需要的
# 但现在不是
# 再来看一下 append
In [20]: a.append("abc")
In [21]: a
Out[21]: [10, 20, 50, 60, 'a', 'b', 'c', 'abc'] # 所以 尾部 直接将 字符串 abc 添加 进去了。
# 这是我要的效果。
# 举这个例子 是希望 体现 两者的不同。
insert()
插入元素 (涉及大量元素插入时,尽量避免使用。)
使用
insert()
方法可以将指定的元素插入到列表对象的任意指定位置。这样会让插入位置后
面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。类似发生这种
移动的函数还有:remove()、pop()、del()
,它们在删除非尾部元素时也会发生操作位置后
面元素的移动。
在尾部操作还是可以的,非尾部尽量避免使用。
>>> a = [10,20,30]
>>> a.insert(2,100) # 将元素 100 插入到 索引 2
>>> a
[10, 20, 100, 30]
In [24]: a.insert(2,[1,2]) # 当插入的 是一个列表的时候
# 和 append 一样 是 将 列表 当做一个元素 插入。
In [25]: a
Out[25]: [10, 20, [1, 2], 100, 30]
乘法扩展,这是浅拷贝。 门牌号(id
)是一样的。
使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。
In [26]: a=["onepis",100]
In [27]: b=a*3
In [28]: b
Out[28]: ['onepis', 100, 'onepis', 100, 'onepis', 100]
In [29]: a
Out[29]: ['onepis', 100]
In [30]: a[0]=1
In [31]: b
Out[31]: ['onepis', 100, 'onepis', 100, 'onepis', 100]
适用于乘法操作的,还有:字符串、元组。
例如:
In [33]: c="onepis"
In [34]: d=c*3
In [35]: d
Out[35]: 'onepisonepisonepis'
In [36]: c
Out[36]: 'onepis'
列表合并
方法1 就是 +
就不再 重复了 前面有
方法2 和 +
差不多 是 sum
函数 本来是求和的。 但是也可以 用来合并列表
In [49]: a=[1,1,3]
In [50]: b=[2,2,2,]
In [53]: sum([a,b],[])
Out[53]: [1, 1, 3, 2, 2, 2]
方法 3 extend
本节前面 也讲过了
方法4 切片 slice
覆盖
In [65]: b=["onepis",222]
In [66]: a=[1,2,3]
In [67]: a
Out[67]: [1, 2, 3]
In [68]: b
Out[68]: ['onepis', 222]
In [69]: len(a)
Out[69]: 3
In [70]: a[len(a):]=b
In [71]: a
Out[71]: [1, 2, 3, 'onepis', 222]
方法5 append
本质上 这个 不算是 合并 列表
我觉得算是追加 因为 是将这个 列表 作为 一个元素 添加 到尾部
前面 也说过了。 就不再多说。
方法6 chain
chain 本质上也算不上 合并
算是连接 吧 返回的是一个 可迭代对象
还有就是 chain 不仅仅可以 连接 列表 。
元组 集合 这些容器 都可以连接
In [80]: help(chain)
Help on class chain in module itertools:
class chain(builtins.object)
| chain(*iterables) --> chain object # 传入的是一个 可迭代对象就可以
# 返回的是一个 chain 对象
# 可以使用 next 方法 获取 返回元素。
|
| Return a chain object whose .__next__() method returns elements from the
In [73]: from itertools import chain
In [74]: a=[1,2,3]
In [75]: b=['one','pis']
In [76]: chain(a,b)
Out[76]: <itertools.chain at 0x5fdead0>
In [77]: [*chain(a,b)] # 序列解包
Out[77]: [1, 2, 3, 'one', 'pis']
In [81]: a={"a":1,"b":2} # 需要注意的是 连接的是一个 dict 字典的时候
# 其实只是 串联了 他们 的 key 。但是value 没有串联。
In [82]: b={"c":3}
In [83]: chain(a,b)
Out[83]: <itertools.chain at 0x7a74cd0>
In [84]: [*chain(a,b)]
Out[84]: ['a', 'b', 'c']
方法7 利用 *
解包
In [74]: a=[1,2,3]
In [75]: b=['one','pis']
In [79]: [*a,*b]
Out[79]: [1, 2, 3, 'one', 'pis']