列表方法
Python 列表提供了丰富的方法来完成增删改查操作。这些方法都原地修改列表并返回 None。
添加元素
append(x) 在列表末尾添加单个元素,无论传入什么都作为一个整体追加:
nums = [1, 2, 3]
nums.append(4) # [1, 2, 3, 4]
nums.append([5, 6]) # [1, 2, 3, 4, [5, 6]],整个列表作为一个元素
注意:append 返回 None,不要赋值给变量。
extend(iterable) 将可迭代对象中的每个元素逐个追加,相当于批量添加:
nums = [1, 2, 3]
nums.extend([4, 5]) # [1, 2, 3, 4, 5]
nums.extend("ab") # [1, 2, 3, 4, 5, 'a', 'b']
extend 原地修改原列表,而 + 总是创建新列表。
insert(i, x) 在指定索引位置插入元素。i 为 0 时插入开头,等于 len(list) 时等同于 append:
nums = [1, 3, 4]
nums.insert(1, 2) # [1, 2, 3, 4]
nums.insert(100, 5) # [0, 1, 2, 3, 4, 5],越界时自动追加到末尾
insert 的时间复杂度是 O(n)。频繁在头部插入时,应使用 collections.deque。
删除元素
remove(x) 删除第一个值等于 x 的元素,不存在时抛出 ValueError:
fruits = ["apple", "banana", "cherry", "banana"]
fruits.remove("banana") # ["apple", "cherry", "banana"],只删第一个
pop([i]) 删除指定索引位置的元素并返回该元素。省略索引时默认删除最后一个:
nums = [10, 20, 30, 40]
last = nums.pop() # last = 40, nums = [10, 20, 30]
空列表或越界时抛出 IndexError。pop() 配合 append() 可实现栈结构。
clear() 移除所有元素,效果等同于 del a[:]:
nums = [1, 2, 3]
nums.clear() # []
查找与统计
index(x[, start[, end]]) 返回第一个值等于 x 的元素的索引。可选参数限定搜索范围:
fruits = ["apple", "banana", "cherry", "banana", "date"]
fruits.index("banana") # 1
fruits.index("banana", 2) # 3,从索引2开始搜索
fruits.index("orange") # ValueError: 'orange' is not in list
返回的索引始终是绝对索引,不受 start 参数影响。
count(x) 统计元素出现次数,不存在时返回 0:
nums = [1, 2, 2, 3, 2, 4]
nums.count(2) # 3
排序与反转
sort(*, key=None, reverse=False) 原地排序,默认升序:
nums = [3, 1, 4, 1, 5, 9, 2, 6]
nums.sort() # [1, 1, 2, 3, 4, 5, 6, 9]
nums.sort(reverse=True) # 降序
key 参数接收函数,从每个元素中提取排序依据:
words = ["banana", "pie", "Washington", "book"]
words.sort(key=len) # 按长度排序
words.sort(key=lambda x: (len(x), x.lower())) # 多条件排序
混合不可比较类型会报错。需要保留原列表时,使用 sorted()。
reverse() 原地反转:
nums = [1, 2, 3, 4]
nums.reverse() # [4, 3, 2, 1]
复制列表
copy() 返回浅拷贝,效果等同于 a[:]:
a = [1, 2, [3, 4]]
b = a.copy()
b[2][0] = 88
print(a) # [1, 2, [88, 4]],内层仍共享
嵌套列表需要 copy.deepcopy() 才能完全独立。