列表的一些操作
列表追加元素
list.extend()
作用
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
例子
>>> list1 = ['Google', 'Runoob', 'Taobao']
>>> list2=list(range(5)) # 创建 0-4 的列表 list1.extend(list2) # 扩展列表
>>> print("扩展后的列表:", list1)
扩展后的列表: ['Google', 'Runoob', 'Taobao']
结果:
扩展后的列表: ['Google', 'Runoob', 'Taobao', 0, 1, 2, 3, 4]
将列表变成字符串
''.join(res)
列表的复制
在Python中,列表的复制、浅复制和深度复制的主要区别是:
- 赋值复制
使用 "=" 号赋值或 copy() 方法只是复制了对象的引用,并没有复制对象本身。也就是说原列表和复制列表对应同一个内存地址,修改任一列表都会影响另一个列表。
a = [1, 2, 3]
b = a
- 浅复制(Shallow Copy)
使用切片操作符[:]、copy() 方法可以构造一个新的列表对象,但新的列表中的元素仍然引用自原始列表中的元素。
import copy
a = [1, 2, 3]
b = a[:]
c = copy.copy(a)
- 深度复制(Deep Copy)
使用 copy 模块的 deepcopy() 方法可以完全复制一个对象,新旧对象完全独立,不共享内存。
import copy
a = [1, 2, 3]
b = copy.deepcopy(a)
deepcopy() 递归地复制对象中的所有子对象。
所以,在 Python 中区分浅复制和深度复制非常重要。简单的赋值复制只会复制对象的引用。如果需要复制列表本身,应该使用切片操作符[:] 或者 copy() 来浅复制,如果列表包含了其他的可变子对象,而且需要递归复制,就需要使用 deepcopy() 来实现深度复制。
图解
1、赋值引用
b = a: a 和 b 都指向同一个对象。
2、浅拷贝
b = a.copy(): a 和 b父对象是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
3、深拷贝
b = copy.deepcopy(a): 完全拷贝了父对象及其子对象,a 和 b 的父对象及其子对象,两者都是完全独立的。
参考:Python 直接赋值、浅拷贝和深度拷贝解析 | 菜鸟教程 (runoob.com)
二维列表排序
使用sorted()函数进行排序,可使用key = lambda x:(x[0],-x[1])
对元素升序或降序,其中-
代表降序,不加为升序。
>>> intervals = [[1,2],[2,3],[3,4],[1,3]]
>>> intervals = sorted(intervals,key = lambda x:(x[0],-x[1]))
>>> intervals
[[1, 3], [1, 2], [2, 3], [3, 4]]
创建二维列表
创建m*n的列表
方法一
>>> m=3
>>> n=4
>>> lists = [[0 for i in range(n)] for j in range(m)]
>>> lists[1][1]=1
>>> lists
[[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
方法二
>>> lists = [[0]*n]*m
>>> lists
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> lists[1][1]=1
>>> lists
[[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]
方法三
>>> lists = [[0]*n for j in range(m)]
>>> lists
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> lists[1][1]=1
>>> lists
[[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
其中,方法一创建的列表各元素是独立的,方法二创建的列表元素之间是浅复制,改变元素会导致相关联元素改变。方法三与方法1相同。