讲解
上一节认识了列表的基本操作,这一节把方法清单系统过一遍。增:append(x) 末尾加一个、extend(iterable) 并入一批、insert(i, x) 在下标 i 处插入。删:remove(x) 按值删第一个匹配、pop(i) 按下标弹出并返回(默认末尾)、clear() 清空。查:index(x) 找第一个匹配的下标(找不到抛 ValueError)、count(x) 统计出现次数。另外还有 reverse() 就地反转、sort() 就地排序、copy() 浅拷贝。
这组方法里要特别注意「修改原列表,返回 None」的统一约定:append、extend、insert、remove、reverse、sort、clear 全部返回 None,效果体现在原列表上;只有 pop 和 index、count 这类查询方法有实质返回值。与之相对的是内置函数 sorted()、reversed()、len()——它们返回新对象,不动原列表。写代码时心里要清楚手上这个是「就地派」还是「出新派」。
排序的 key 参数值得展开:key 接收一个函数,对每个元素算出「排序依据」。sorted(words, key=len) 按长度排,sorted(students, key=lambda s: s['score'], reverse=True) 按分数降序(lambda 后面有专门章节)。列表还天然可以当栈用:append 入栈、pop() 出栈,都是 O(1);但当队列用要小心——pop(0) 弹出队首是 O(n),大列表频繁队首操作请改用 collections.deque。
示例
# 增删查全览
cart = ['书', '笔']
cart.append('本子')
cart.insert(0, '橡皮')
print('当前购物车:', cart)
print('笔在第几位:', cart.index('笔'))
print('出现次数:', cart.count('书'))
removed = cart.pop(1)
print('移除了:', removed, ',剩余:', cart)
# 「就地派」返回 None
result = cart.reverse()
print('reverse 返回值:', result, ',列表本身:', cart)
# 排序进阶:key 函数
students = [
{'name': '小明', 'score': 88},
{'name': '小红', 'score': 95},
{'name': '小刚', 'score': 72},
]
by_score = sorted(students, key=lambda s: s['score'], reverse=True)
print('按分数降序:', [(s['name'], s['score']) for s in by_score])
# 多关键字排序:元组作 key,先分数后姓名
print('多关键字:', sorted(words := ['bb', 'a', 'cc', 'b'], key=lambda w: (len(w), w)))
# 列表当栈:append 入、pop 出
stack = []
for item in ['第一', '第二', '第三']:
stack.append(item)
print('出栈顺序:', stack.pop(), stack.pop(), stack.pop())
# 当队列请用 deque(队首操作 O(1))
from collections import deque
queue = deque(['甲', '乙', '丙'])
queue.append('丁')
print('队列出队:', queue.popleft(), ',剩余:', list(queue))
常见坑
- 把就地方法的返回值赋给变量:nums = nums.sort() 让 nums 变成 None。sort/reverse/append 都原地生效,直接调用即可。
- index 找不到抛异常:不确定元素是否存在时,先 if x in list 再 index,或者用 try/except。
- insert 下标越界不报错:list.insert(999, x) 不会报错,只是把 x 放到末尾——这和取下标的严格性不同,别依赖它发现逻辑错误。
- 大列表频繁 pop(0):每次弹出队首都要把后面所有元素前移一位,数据量大时性能骤降,改用 collections.deque。
小结
增删查:append/extend/insert、remove/pop/clear、index/count;就地方法返回 None;key 参数定制排序;栈用列表、队列用 deque。下一节看不可变版列表:元组。