27_列表元素的添加_以及合并列表的7种方式


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']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值