今天我们继续深入讲解 Python 字典的 高级用法与技巧,包括:
defaultdict
:带默认值的字典Counter
:快速统计工具- 字典排序:按键或值排序
- 合并字典(传统方式和 Python 3.9+ 新语法)
- 嵌套字典的安全访问
collections.defaultdict
:自动创建默认值
来自 collections
模块的 defaultdict
是一种可以在访问不存在的 key 时自动生成默认值的字典。
使用方式:
from collections import defaultdict# 默认值为 int(),即 0
counts = defaultdict(int)words = ['apple', 'banana', 'apple']
for word in words:counts[word] += 1print(counts) # {'apple': 2, 'banana': 1}
常见场景:
- 统计频率(用
int
作为默认工厂) - 创建嵌套字典(用
dict
或defaultdict
) - 列表自动追加(用
list
)
# 嵌套字典
tree = defaultdict(lambda: defaultdict(int))
tree["fruit"]["apple"] += 1# 值为列表
group = defaultdict(list)
group["math"].append("Alice")
group["math"].append("Bob")
collections.Counter
:频率统计神器
用于快速统计元素出现次数。
from collections import Counterdata = ['apple', 'banana', 'apple', 'orange', 'banana']
count = Counter(data)print(count) # Counter({'apple': 2, 'banana': 2, 'orange': 1})
print(count['apple']) # 2
方法:
count.most_common(2) # [('apple', 2), ('banana', 2)]
count.update(['apple']) # 再加一个 'apple'
字典排序(按 key / value)
字典本身是无序(3.6 之后有序表现,但不用于排序),你可以使用 sorted()
对字典内容排序:
按值排序:
d = {'a': 3, 'b': 1, 'c': 2}
sorted_items = sorted(d.items(), key=lambda item: item[1])print(dict(sorted_items)) # {'b': 1, 'c': 2, 'a': 3}
按键排序:
sorted_by_key = dict(sorted(d.items(), key=lambda x: x[0]))
合并字典的方法
Python < 3.9:
a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}
merged = {**a, **b} # 若键冲突,b 会覆盖 a
Python ≥ 3.9 新写法:
a = {'x': 1}
b = {'y': 2}
c = a | b # 合并
安全访问嵌套字典
防止 KeyError
的方式:
person = {"name": "Alice","address": {"city": "Beijing","code": 10001}
}# 安全访问嵌套值
city = person.get("address", {}).get("city", "Unknown")
补充:创建嵌套字典的 defaultdict
技巧
nested = defaultdict(lambda: defaultdict(list))
nested["class"]["math"].append("Alice")
下面通过两个实战小项目,深入掌握 Counter
和 defaultdict
的应用技巧:
项目一:使用 Counter
实现词频统计器(英文)
目标:读取一段文本,统计其中每个单词出现的次数,并输出出现频率最高的前 N 个单词。
示例代码:
from collections import Counter
import redef word_count(text, top_n=10):# 使用正则将文本中的单词提取出来(忽略大小写)words = re.findall(r'\b\w+\b', text.lower())# 用 Counter 统计频率counter = Counter(words)# 输出前 N 个高频词for word, freq in counter.most_common(top_n):print(f"{word}: {freq}")# 示例用法
text = """
Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence
concerned with the interactions between computers and human language.
"""word_count(text, top_n=5)
输出示例:
and: 3
language: 2
natural: 1
processing: 1
nlp: 1
项目二:使用 defaultdict
构建嵌套 JSON-like 数据结构
目标:自动构建一个部门 -> 课程 -> 学生列表 的嵌套结构。
示例代码:
from collections import defaultdict
import json# 三层嵌套 defaultdict
school = defaultdict(lambda: defaultdict(list))# 添加数据
school["Engineering"]["Math"].append("Alice")
school["Engineering"]["Math"].append("Bob")
school["Engineering"]["Physics"].append("Charlie")
school["Arts"]["Literature"].append("Daisy")# 可转为普通 dict 方便输出
def convert(d):if isinstance(d, defaultdict):d = {k: convert(v) for k, v in d.items()}return d# 打印嵌套 JSON 样式
print(json.dumps(convert(school), indent=2))
输出示例:
{"Engineering": {"Math": ["Alice","Bob"],"Physics": ["Charlie"]},"Arts": {"Literature": ["Daisy"]}
}
总结
工具 | 用途 | 优势 |
---|---|---|
Counter | 快速统计元素频率 | 简洁、可排序、可更新 |
defaultdict | 自动初始化默认值,构建嵌套结构 | 不必手动判断 key 是否存在 |