【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。

更多推荐