Menu

Python 列表:创建、索引、添加、排序与遍历

Python 列表实用指南。列表是最常用的集合类型,本文介绍创建、索引、切片、append、排序,以及你最常用到的写法。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

列表是有序、可变的序列

列表是 Python 中最常用的集合类型。如果你要保存一组有顺序、可能会变化(添加、删除、排序、更新)的值,列表几乎总是正确的选择。

用方括号创建列表:

列表可以存放任何东西,甚至是其他列表。实际上,大多数列表最终只存放一类东西,比如用户列表、数字列表,因为这样最容易理解。

索引

每个元素都有一个位置,从 0 开始。用方括号访问:

访问不存在的索引会抛出 IndexError。如果有可能越界,要么先检查长度,要么把访问放进 try 里。

切片

切片会给你一段范围内的元素。语法是 list[start:stop:step],和字符串一样:

有两点值得牢记:

  • 切片总是返回一个新列表。修改切片不会影响原列表。
  • 结束索引不包含在内:nums[2:5] 取的是索引 2、3、4,不包括 5。

如何用 append、extend 和 insert 添加元素

这三个“往列表里添加”的方法作用各不相同,混用它们是常见的 bug 来源:

  • append(x) 把 x 作为单个元素添加,即使 x 是列表也一样。items.append([1, 2]) 会把这个列表本身作为一个元素加进去。
  • extend(iterable) 把可迭代对象中的每个元素逐个添加。items.extend([1, 2]) 会添加两个元素。
  • insert(i, x) 在指定索引处插入,把 i 及之后的所有元素往后移一位。

右边是列表时,+= 的效果和 extend 一样:

删除元素的方法:

如果用 remove() 删除列表中不存在的东西,Python 会抛出 ValueError。如果你需要“存在就删除”,要么先用 in 检查,要么用 try。

你也可以用 del 按索引删除:

长度、成员检查与计数

in 是检查列表是否包含某个值的易读写法。如果你要在一个大列表上反复做这种检查,请改用集合:集合的成员检查是 O(1),而列表是 O(n)。

排序

有两种方式,选哪种很重要:

两者都接受 reverse=True 来降序排列:

还可以用 key 函数自定义排序:

key 会作用在每个元素上,比较的是它返回的结果。常见用法:按长度排序、按某个属性排序,或者按字符串的小写形式排序。

反转

根据需要,有三种写法:

不需要保留原列表时,用原地反转。想要一个新副本时,用切片。只想倒序遍历、又不想生成新列表时,用 reversed()。

共享引用的陷阱

列表是可变的,而变量是引用。这意味着两个变量可以指向同一个列表:

b = a 并没有复制列表,只是让 b 成为同一个列表的第二个名字。如果你想要副本,就明确地复制一份:

每个 Python 程序员都至少被这个问题坑过一次。记住:两个列表之间的 = 不会复制。

遍历与构建

for 循环那一页已经介绍过基本写法:

这样写很易读,任何时候都没问题。等你熟练之后,等价的列表推导式只用一行就能完成同样的事:

我们会在后面第二页详细介绍推导式。

速查表

值得记住的方法一览:

  • append(x):添加到末尾
  • extend(iter):逐个添加可迭代对象中的元素
  • insert(i, x):在索引 i 处插入
  • pop() / pop(i):删除并返回
  • remove(x):删除第一个 x
  • sort() / sort(key=...) / sort(reverse=True)
  • reverse()
  • index(x):第一个 x 的位置
  • count(x):x 出现的次数
  • copy():浅拷贝

下一步

列表是最常用的主力工具。接下来我们会看看元组,也就是列表的不可变版本,以及什么时候用元组更合适。

常见问题

Python 中如何创建列表?

用方括号把逗号分隔的值括起来:fruits = ['apple', 'banana', 'cherry']。列表可以存放任何类型,同一个列表里也可以混合不同类型,不过实际使用中,大多数列表习惯上只存放同一类数据。

Python 中如何对列表排序?

调用列表的 .sort() 方法可以原地排序;或者用内置函数 sorted(list) 得到一个新的有序列表,原列表保持不变。两者都接受 reverse=True 参数来降序排列,以及 key= 参数来自定义排序依据。

Python 中如何反转列表?

list.reverse() 原地反转。list[::-1] 返回一个反转后的新列表。reversed(list) 返回一个可以遍历的迭代器。按需选择:原地修改、新副本,还是惰性迭代。

Coddy 编程语言插图

和 Coddy 一起学编程

开始