人人都会AI编程

8.1 列表:常用方法、列表推导式、切片原理

更新时间:2026-07-12

列表(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。

关键规则

  1. 左闭右开[start, stop),即包含 start 索引的元素,不包含 stop 索引的元素。
  2. 允许负数索引:-1 表示最后一个,-2 表示倒数第二个,以此类推。
  3. 可以缺省任何部分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 代码的必备技能。