9.1 创建列表的副本
在Python中创建列表的副本是个很重要的任务,尤其当你不想在操作列表时意外改变数据。工作中要搞清楚浅复制(shallow
)和深复制(deep
)的区别。
浅复制
浅复制创建一个新的列表,但元素还是原来的(如果元素是引用,那引用也会被复制)。这可以通过几种方法来实现:
使用list()
函数:
original = [1, 2, 3]
copy = list(original)
使用切片:
original = [1, 2, 3]
copy = original[:]
使用copy()
方法:
深复制
深复制创建一个新的列表,还为其中所有嵌套对象创建副本。这在列表包含其他可变数据类型(比如其他列表)时尤其重要。这里用到copy
模块:
import copy
original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)
何时使用哪个方法
浅复制速度更快,适合在元素简单或不需要被复制的情况下使用(比如字符串或数字)。深复制则用于元素本身是可变集合或复制的改变不能影响原件的时候。
9.2 删除列表中的元素
这是个又简单又复杂的任务:在循环中删除列表中的元素。
当我们用for
循环遍历列表时,列表返回一个特殊的子对象—迭代器,for
循环用它来遍历所有元素。如果在使用迭代器时从列表删除元素,迭代器可能会出错。
如果你删了第3个元素,那么第4个就自动变成第3个。而for
循环借助迭代器会跳到新的第4个元素,也就是原来的第5个元素。这样,第4个元素就会被跳过。
下面是一些安全删除元素的方法:
使用remove()
方法
如果明确知道要删除哪个元素,可以在循环中使用remove()
。但如果元素很多,这样做可能效率低,因为每次调用remove()
都会先找到元素再删掉,这样会慢。
创建新列表
更安全的方法是创建一个只包含要保留元素的新列表:
original_list = [1, 2, 3, 4, 5, 6]
new_list = [x for x in original_list if x % 2 != 0] # 只保留奇数
使用索引
可以用反向索引的for
循环来删除元素,不用担心跳过:
for i in range(len(original_list) - 1, -1, -1):
if original_list[i] % 2 == 0: # 删除条件
del original_list[i]
当我们从列表末尾开始,这样元素删除后只有已经过的元素索引会被改变。
使用列表副本:
比如,你想删除列表中的所有负数:
numbers = [1, -1, 2, -2, 3, -3]
# 创建列表副本以安全迭代
for number in numbers.copy():
if number < 0:
numbers.remove(number)
print(numbers) # 显示 [1, 2, 3]
9.3 合并列表
经常需要把两个或更多的列表合成一个。方法有好几种,每种适合不同的任务,也各有特点。
使用+
操作符
合并两个列表最简单的方法是用+
操作符。这是个简单直观的方法:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list) # 显示 [1, 2, 3, 4, 5, 6]
使用extend()
方法
extend()
方法将第二个列表里的所有元素添加到第一个列表的末尾,修改原列表:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1) # 显示 [1, 2, 3, 4, 5, 6]
列表解析
列表解析可以用来通过合并多个列表的元素创建新列表:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = [item for sublist in [list1, list2] for item in sublist]
print(combined_list) # 显示 [1, 2, 3, 4, 5, 6]
使用append()
方法
可以一个一个的把第二个列表的元素加入第一个列表。作为选项。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
for x in list2:
list1.append(x)
print(list1) # 显示 [1, 2, 3, 4, 5, 6]
基本上,这就是我想跟你们分享的关于列表的一切 😊
GO TO FULL VERSION