列表(list)和字典(dict)是 Python 中使用频率最高的两种容器:前者处理"有序的一串东西",后者处理"键到值的映射"。90% 的数据处理任务都可以抽象成"列表 + 字典"的组合。本文不讲 API 清单,而是用实战场景带你掌握它们的正确打开方式。
1. 列表:增删改查
列表是可变序列,增删改查各有多种手段,按场景选最合适的:
tasks = ["写代码", "测试", "部署"]
tasks.append("维护") # 末尾添加
tasks.insert(1, "评审") # 指定位置插入
tasks.remove("测试") # 按值删除(只删第一个)
last = tasks.pop() # 弹出末尾并返回
first = tasks.pop(0) # 弹出指定下标
print(tasks) # ['写代码', '评审', '部署']
print("部署" in tasks)
print(len(tasks))
2. 切片与复制
切片 [start:end:step] 是列表最强大的语法,还能用来做浅拷贝:
nums = [0, 1, 2, 3, 4, 5]
print(nums[1:4]) # [1, 2, 3] 含头不含尾
print(nums[:3]) # [0, 1, 2]
print(nums[::2]) # [0, 2, 4] 隔一个取一个
print(nums[::-1]) # [5, 4, 3, 2, 1, 0] 反转
# 三种拷贝方式
copy1 = nums[:]
copy2 = nums.copy()
copy3 = list(nums)
# 注意:嵌套列表的浅拷贝只复制外层
matrix = [[1, 2], [3, 4]]
shallow = matrix[:]
shallow[0][0] = 99
print(matrix) # [[99, 2], [3, 4]] 内层被改了!
需要完全独立的副本时用 copy.deepcopy()。
3. 排序与去重
scores = [88, 72, 95, 61, 88]
scores.sort() # 原地升序
print(scores) # [61, 72, 88, 88, 95]
# 不修改原列表的排序
sorted_scores = sorted(scores, reverse=True)
print(sorted_scores) # [95, 88, 88, 72, 61]
# 去重:转 set 再转回 list
unique = list(set(scores))
print(unique) # [72, 88, 95, 61] 顺序不保证
需要保持顺序去重时,用 dict.fromkeys() 或遍历 + 集合记录。
4. 字典:键值对操作
字典查找是 O(1) 的,是"按名字找东西"的首选。增删改查与安全取值:
user = {"name": "Ada", "age": 18}
user["city"] = "北京" # 新增键
user["age"] = 19 # 修改已有键
del user["city"] # 删除键
# get:键不存在时返回默认值,不报错
age = user.get("age", 0) # 19
email = user.get("email", "未填写") # 未填写
# 合并两个字典
user.update({"hobby": "coding", "age": 20})
print(user)
5. 遍历字典的三种姿势
stock = {"苹果": 5, "香蕉": 12, "橙子": 0}
for key in stock: # 默认遍历键
print(key)
for key, value in stock.items(): # 键值对
print(f"{key}: {value}")
for value in stock.values(): # 只取值
print(value)
# 条件筛选:库存不足的水果
low = [k for k, v in stock.items() if v == 0]
print(low) # ['橙子']
6. 综合实战:统计词频
把列表和字典组合起来,完成一个经典任务——统计文本中每个单词出现的次数:
text = "python code data python code python"
words = text.split()
freq = {}
for w in words:
freq[w] = freq.get(w, 0) + 1 # 等价于 if/else 计数
# 按出现次数从高到低排序
ranking = sorted(freq.items(), key=lambda x: x[1], reverse=True)
print(ranking) # [('python', 3), ('code', 2), ('data', 1)]
# 用 collections.Counter 一行搞定
from collections import Counter
print(Counter(words).most_common(2))
💡 学习建议:把"词频统计"这个例子自己重写三遍(纯循环版、get 版、Counter 版),体会三种写法的演进。列表 + 字典的组合能解决绝大多数入门级数据处理问题。