【Python入门】用词频统计搞懂 dict,从手写到 Counter 只需 3 步
·
【Python入门】用词频统计搞懂 dict,从手写到 Counter 只需 3 步
学 Python 数据结构,dict 是最常用、最实用的。这篇文章用一个"词频统计"的实战,带你从零搞懂 dict 的核心用法。
一、先看问题
假设你有一段文本,要统计每个词出现的次数:
输入:'我 爱 Python 我 爱 编程'
输出:{'我': 2, '爱': 2, 'Python': 1, '编程': 1}
怎么实现?答案就是 dict(字典)。
二、dict 基础:5 个必须掌握的操作
1. 创建字典
d = {'name': '张三', 'age': 25}
2. 读取值:两种方式的区别
d = {'name': '张三', 'age': 25}
d['name'] # → '张三' ✅ key 存在时正常读取
d['city'] # → KeyError ❌ key 不存在直接报错
d.get('name') # → '张三' ✅ key 存在时正常读取
d.get('city') # → None ✅ key 不存在返回 None,不报错
d.get('city', 0) # → 0 ✅ key 不存在返回默认值
⚠️ 新手常见坑:用
d['key']读取时 key 不存在会报 KeyError,推荐用get()方法,安全又灵活。
3. 添加/修改值
d = {'name': '张三', 'age': 25}
d['city'] = '北京' # key 不存在 → 自动创建新键值对
d['age'] = 26 # key 已存在 → 覆盖旧值
print(d) # → {'name': '张三', 'age': 26, 'city': '北京'}
💡 注意:字典赋值时 key 不存在不会报错,会自动创建。只有读取不存在的 key 才会 KeyError。
4. 删除值
d = {'name': '张三', 'age': 25, 'city': '北京'}
d.pop('age') # → 25(返回被删除的值)
del d['name'] # 无返回值
print(d) # → {'city': '北京'}
5. 遍历字典
d = {'name': '张三', 'age': 25, 'city': '北京'}
for key in d.keys(): # 遍历 key
print(key)
for value in d.values(): # 遍历 value
print(value)
for key, value in d.items(): # 遍历键值对 ✅ 最常用
print(f'{key}: {value}')
三、实战:词频统计
现在回到开头的问题——统计文本中每个词出现的次数。
第 1 步:手写实现
def word_count(text):
mydict = {}
for item in text.strip().split():
if item in mydict:
mydict[item] = mydict.get(item) + 1
else:
mydict[item] = 1
return mydict
print(word_count('我 爱 Python 我 爱 编程'))
# → {'我': 2, '爱': 2, 'Python': 1, '编程': 1}
能跑,但代码有点多。分析一下:if/else 其实只做了一件事——计数。能不能更简洁?
第 2 步:用 get() 简化
def word_count(text):
result = {}
for word in text.strip().split():
result[word] = result.get(word, 0) + 1
return result
print(word_count('我 爱 Python 我 爱 编程'))
# → {'我': 2, '爱': 2, 'Python': 1, '编程': 1}
get(word, 0) 的意思是:key 存在就返回当前值,不存在就返回 0。然后 +1,一行搞定。
第 3 步:用标准库 Counter
from collections import Counter
def word_count(text):
return Counter(text.strip().split())
print(word_count('我 爱 Python 我 爱 编程'))
# → Counter({'我': 2, '爱': 2, 'Python': 1, '编程': 1})
Python 标准库已经帮我们做好了。Counter 经过大量测试,性能和可靠性都比手写好。实际开发中,优先使用标准库。
三步对比
| 版本 | 代码行数 | 核心改进 |
|---|---|---|
| 手写 if/else | 6 行 | 基础实现,能跑 |
| get() 简化 | 3 行 | 消除 if/else,逻辑更清晰 |
| Counter | 1 行 | 标准库,一行搞定 |
四、对比总结
| 操作 | 方法 | key 不存在时 |
|---|---|---|
| 读取 | d['key'] |
❌ KeyError |
| 读取 | d.get('key') |
✅ 返回 None |
| 读取 | d.get('key', 0) |
✅ 返回默认值 |
| 添加 | d['key'] = val |
自动创建 |
| 修改 | d['key'] = val |
覆盖旧值 |
| 删除 | d.pop('key') |
❌ KeyError |
五、踩坑记录
坑 1:get() 的逗号位置
d = {'name': '张三'}
# ❌ 错误写法:两个参数传给 print
print(d.get('age'), 0) # → None 0
# ✅ 正确写法:0 是 get 的默认值
print(d.get('age', 0)) # → 0
逗号位置不同,含义完全不同!d.get('age'), 0 是一个元组,d.get('age', 0) 才是带默认值的 get。
坑 2:字典赋值 vs 读取
d = {}
d['new_key'] = 'value' # ✅ 赋值时 key 不存在,自动创建
print(d['not_exist']) # ❌ 读取时 key 不存在,KeyError!
赋值不报错,读取才报错——这是新手最容易混淆的地方。
六、延伸:dict 的其他实用技巧
1. setdefault:一次完成"判断+赋值"
d = {}
d.setdefault('name', '未知') # key 不存在时设为默认值,存在则不变
print(d) # → {'name': '未知'}
2. defaultdict:省去判断的烦恼
from collections import defaultdict
result = defaultdict(int) # 所有 key 默认值为 0
result['Python'] += 1 # 不用判断 key 是否存在
print(result) # → defaultdict(<class 'int'>, {'Python': 1})
3. 字典推导式:快速创建字典
squares = {x: x**2 for x in range(5)}
print(squares) # → {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
📌 总结:dict 是 Python 中最常用的数据结构之一。掌握
get()、setdefault()、Counter这几个方法,能让你少写很多 if/else,代码更简洁更 Pythonic。
更多推荐


所有评论(0)