Skip to content

列表与元组常用 API ​

学习目标 ​

  • 区分可变的 list 和不可变的 tuple。
  • 掌握索引、切片、增删改、排序和解包。
  • 知道浅拷贝、嵌套容器和排序键函数的边界。

核心知识点 ​

列表是有序、可变序列;元组是有序、不可变序列。二者都支持索引、切片、迭代和 in。列表方法如 append、sort 会原地修改并返回 None。

常用用法 ​

创建与索引 ​

python
items = ["a", "b", "c"]
point = (10, 20)
print(items[0], items[-1], point[1])
# 输出:a c 20

需要表达“记录不可修改”时优先元组;需要不断增删元素时使用列表。

切片与步长 ​

python
values = [0, 1, 2, 3, 4, 5]
print(values[1:5], values[::2], values[::-1])
# 输出:[1, 2, 3, 4] [0, 2, 4] [5, 4, 3, 2, 1, 0]

切片创建新列表;给列表切片赋值可以替换长度不同的片段。

list.append() 与 list.extend() ​

python
items = [1]
items.append([2, 3])
items.extend([4, 5])
print(items)
# 输出:[1, [2, 3], 4, 5]

append 添加一个元素,extend 逐个添加可迭代对象的元素。

list.insert()、remove()、pop() ​

python
items = ["a", "b", "c"]
items.insert(1, "x")
removed = items.pop(2)
items.remove("a")
print(items, removed)
# 输出:['x', 'c'] b

remove 按值删除第一次匹配;pop 按索引删除并返回值;不确定元素是否存在时先判断或捕获 ValueError。

list.sort() 与 sorted() ​

python
items = [{"name": "b", "score": 2}, {"name": "a", "score": 3}]
ordered = sorted(items, key=lambda item: item["score"], reverse=True)
print([item["name"] for item in ordered])
# 输出:['a', 'b']

sort 原地排序返回 None;sorted 返回新列表并可用于任意可迭代对象。

列表解包 ​

python
first, *rest, last = [10, 20, 30, 40]
print(first, rest, last)
# 输出:10 [20, 30] 40

星号目标总是列表,即使只接收一个元素。

元组作为不可变记录 ​

python
name, age = ("Ada", 36)
record = (name, age)
print(record, record == ("Ada", 36))
# 输出:('Ada', 36) True

空元组是 ();单元素元组必须写逗号,例如 (1,)。

不常用但需要知道 ​

list.copy() 与浅拷贝 ​

python
rows = [[1], [2]]
clone = rows.copy()
clone[0].append(9)
print(rows, clone)
# 输出:[[1, 9], [2]] [[1, 9], [2]]

浅拷贝只复制外层;嵌套对象仍共享,需要独立副本时使用 copy.deepcopy。

tuple.index() 与 tuple.count() ​

python
values = ("a", "b", "a")
print(values.index("b"), values.count("a"))
# 输出:1 2

这两个方法只查值,不改变元组。

operator.itemgetter() ​

python
from operator import itemgetter

rows = [("b", 2), ("a", 3)]
print(sorted(rows, key=itemgetter(1)))
# 输出:[('b', 2), ('a', 3)]

在多处复用排序键时,itemgetter 比重复 lambda 更简洁。

易混点 ​

  • append 和 extend 的参数语义不同。
  • sort() 返回 None,不能写 new = items.sort() 期待得到列表。
  • a = b = [] 让两个名字共享同一个列表。
  • 列表切片是浅拷贝,不会递归复制嵌套对象。
  • 元组不可变不代表其中的可变元素不可变,例如 ([1],) 里的列表仍可修改。

课后小问 ​

  1. 如何把 [1, 2] 添加为一个整体元素? 答案:使用 append([1, 2])。 解析:extend([1, 2]) 会展开为两个元素;append 把参数作为单个元素加入。

  2. sorted(values) 与 values.sort() 的主要区别是什么? 答案:前者返回新列表且不改原对象,后者原地排序并返回 None。 解析:需要保留原顺序时用 sorted,希望减少额外列表且允许修改时用 sort。

本节小结 ​

列表负责可变序列操作,元组表达不可变记录;熟练掌握切片、增删、排序、解包和拷贝,就能覆盖大多数容器代码。

快速回顾 ​

  • 修改序列:append、extend、insert、pop
  • 查询:索引、切片、index、count
  • 排序:sorted(新对象)、sort(原地)
  • 结构语义:列表可变,元组不可变
  • 拷贝边界:切片和 copy 都是浅拷贝