列表(list)是 Python 中使用频率最高的容器。它是一个可变、有序、可重复的元素集合,可以随时增删改查,是组织数据的瑞士军刀。
常用方法
列表提供了丰富的内置方法,覆盖了大多数操作需求。以下是日常最常用的:
- 增
append(item):在末尾追加一个元素,最常用。insert(index, item):在指定位置插入元素,后续元素依次后移。extend(iterable):将另一个可迭代对象(如列表、元组)的所有元素追加到末尾,相当于是批量append。
- 删
remove(item):删除第一个匹配的元素,元素不存在会报错。pop([index]):删除并返回指定索引的元素,默认删除最后一个。常用它模拟栈或队列。clear():清空整个列表。del lst[start:end]或del lst[index]:按索引或切片删除,del是语句,不是方法。
- 查与改
- 通过索引直接访问和修改,如
lst[0] = new_value。 index(item):返回第一个匹配元素的索引,找不到报错。count(item):统计元素出现次数。in成员运算符:item in lst判断是否存在。
- 排序与反转
sort(key=None, reverse=False):就地排序,改变原列表。key可以传入函数定制排序逻辑。reverse():就地反转列表。- 如果不希望修改原列表,可以用内置函数
sorted(lst)和reversed(lst),它们返回新的可迭代对象。
- 复制
copy():浅拷贝列表,等价于lst[:]。注意如果列表里嵌套可变对象,浅拷贝只复制外层。
实用技巧:在不确定元素是否存在时删改,先用 in 检查或用 try...except 捕获异常,更为稳妥。
列表推导式
列表推导式(List Comprehension)是 Python 中生成新列表的一种简洁、高效、可读性高的语法,它用单行表达式替代传统的 for 循环 + append 模式。
基本语法:[表达式 for 变量 in 可迭代对象 if 条件]
- 简单示例:生成 0 到 9 的平方列表
squares = [x**2 for x in range(10)]
- 带条件的示例:只保留偶数平方
even_squares = [x**2 for x in range(10) if x % 2 == 0]
- 多重循环:展平二维数组
flat = [elem for row in matrix for elem in row]
注意循环顺序和普通 for 循环一样,外层在前。
为什么常用?
- 比等价的
for循环更短更清晰,而且执行速度通常更快(因为是在 C 层面进行迭代)。 - 但要避免嵌套过深,通常一层或两层的推导式可读性最好。如果逻辑太复杂,还是用常规循环更清晰。
类似写法:除了列表推导式,还有字典推导式 {k:v for ...} 和集合推导式 {x for ...},语法完全一致,只是外面换了大括号。
切片原理
切片是 Python 序列操作的精华,让你能够简洁地获取子序列,语法是 序列[start:stop:step]。
start:起始索引(包含),默认为 0(从头开始)。stop:结束索引(不包含),默认为序列长度(到末尾)。step:步长,可以为负数,默认为 1。
关键规则:
- 左闭右开:
[start, stop),即包含 start 索引的元素,不包含 stop 索引的元素。 - 允许负数索引:-1 表示最后一个,-2 表示倒数第二个,以此类推。
- 可以缺省任何部分:
lst[:]复制整个列表;lst[::2]每两步取一个;lst[::-1]反转列表。
常见案例:
- 复制列表:
new_lst = lst[:](浅拷贝)。 - 取前 n 个:
lst[:n]或lst[0:n]。 - 取后 n 个:
lst[-n:]。 - 反转:
reversed_lst = lst[::-1]。 - 删除中间一段:
del lst[2:5]或直接赋值空列表lst[2:5] = []。 - 替换一段:
lst[1:3] = [10, 20, 30]可以插入不同长度的序列,列表会自动调整大小。
原理:切片实际上是调用对象的 getitem 方法,并传入一个 slice(start, stop, step) 对象。对于列表,解释器内部会创建新的列表并拷贝元素,因此切片操作的时间复杂度是 O(k)(k 是切片长度)。这意味着取单个元素 lst[i] 很快,但取一个大切片需要复制数据。
掌握切片,你就能用极少的代码完成很多复杂提取和就地修改,是写出地道 Python 代码的必备技能。