列表与元组常用 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'] bremove 按值删除第一次匹配;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, 2]添加为一个整体元素? 答案:使用append([1, 2])。 解析:extend([1, 2])会展开为两个元素;append把参数作为单个元素加入。sorted(values)与values.sort()的主要区别是什么? 答案:前者返回新列表且不改原对象,后者原地排序并返回None。 解析:需要保留原顺序时用sorted,希望减少额外列表且允许修改时用sort。
本节小结
列表负责可变序列操作,元组表达不可变记录;熟练掌握切片、增删、排序、解包和拷贝,就能覆盖大多数容器代码。
快速回顾
- 修改序列:
append、extend、insert、pop - 查询:索引、切片、
index、count - 排序:
sorted(新对象)、sort(原地) - 结构语义:列表可变,元组不可变
- 拷贝边界:切片和
copy都是浅拷贝
阿源的知识库