Python 学习之路 —— 字典(dict)详解
(从零基础到能熟练使用常见场景,2025-2026 风格写法)
字典是 Python 中使用频率极高的数据结构,几乎可以说是“Python 程序员的瑞士军刀”。
一、字典的核心概念(一句话总结)
无序(3.7+ 有序)、可变、键值对映射
键(key) → 值(value)的映射关系
键必须是不可变类型,值可以是任意类型
# 最直观的理解方式
d = {
"name": "小明",
"age": 18,
"is_student": True,
"scores": [88, 92, 95],
"address": {"city": "上海", "street": "浦东新区"}
}
二、创建字典的 7 种常见写法(按使用频率排序)
| 序号 | 写法 | 适用场景 | Python 版本要求 |
|---|---|---|---|
| 1 | {k1:v1, k2:v2} | 最常用、最直观 | 全版本 |
| 2 | dict() + 关键字参数 | 键是合法标识符时很简洁 | 全版本 |
| 3 | dict([("k1",v1), ("k2",v2)]) | 从列表/元组对创建 | 全版本 |
| 4 | {k:v for k,v in 可迭代对象} | 字典推导式(最强大) | 3.0+ |
| 5 | dict.fromkeys(keys, default) | 快速创建大量相同默认值的键 | 全版本 |
| 6 | dict(zip(keys, values)) | 两个等长列表/元组合并成字典 | 全版本 |
| 7 | collections.defaultdict | 访问不存在的key时自动创建默认值 | 需要 import |
# 写法对比示例
d1 = {"a":1, "b":2, "c":3}
d2 = dict(a=1, b=2, c=3) # 注意这里键不用加引号
d3 = dict([("x",10), ("y",20)])
d4 = {k: k*2 for k in range(5)} # {0:0, 1:2, 2:4, 3:6, 4:8}
d5 = dict.fromkeys(["name","age","city"], None) # 常用于初始化模板
d6 = dict(zip(["id","name","score"], [1001, "Tom", 88.5]))
from collections import defaultdict
d7 = defaultdict(int) # 不存在的键默认返回 0
d7["count"] += 1
三、字典最常用的 12 个操作(强烈建议背下来)
| 操作类型 | 写法示例 | 说明 / 常见用途 | 是否修改原字典 |
|---|---|---|---|
| 新增/修改 | d["new_key"] = value | 最常用写法 | 是 |
| 新增/修改 | d.update({"k1":v1, "k2":v2}) | 批量更新,可传入 dict/列表/关键字参数 | 是 |
| 获取 | d["key"] | 键不存在 → KeyError | 否 |
| 获取(安全) | d.get("key", 默认值) | 键不存在返回默认值(默认 None) | 否 |
| 获取(安全) | d.setdefault("key", 默认值) | 不存在则设置默认值并返回 | 是(可能) |
| 删除 | del d["key"] | 键不存在 → KeyError | 是 |
| 删除 | d.pop("key", 默认值) | 键不存在返回默认值(默认引发 KeyError) | 是 |
| 删除并清空 | d.popitem() | 3.7+ 删除并返回最后一对(LIFO) | 是 |
| 清空 | d.clear() | 清空所有元素 | 是 |
| 长度 | len(d) | 键值对数量 | 否 |
| 成员判断 | "key" in d / "key" not in d | 判断键是否存在(最快 O(1)) | 否 |
| 遍历 | for k in d: | 默认遍历所有键 | 否 |
四、字典遍历的 4 种主流写法对比(面试+日常高频)
d = {"name":"Alice", "age":25, "city":"Beijing"}
# 1. 只遍历 key(最常用)
for k in d:
print(k, d[k])
# 2. 显式遍历 key
for k in d.keys():
print(k)
# 3. 遍历 value
for v in d.values():
print(v)
# 4. 同时拿到 key 和 value(**最推荐**)
for k, v in d.items():
print(f"{k:>8} : {v}")
五、Python 3.7+ 最重要的两个变化(必须知道)
- 插入顺序保证(从 3.7 开始官方保证,3.6 是实现细节)
- 字典按照插入顺序迭代和显示
dict.keys()、dict.values()、dict.items()也保持插入顺序
- 更高效的实现(CPython 整体优化)
六、字典常见使用场景 & 优雅写法(真实项目高频)
# 场景1:计数(分组统计)
from collections import Counter # 更推荐
# 或纯 dict 实现
count = {}
for item in ["apple","banana","apple","cherry","banana","apple"]:
count[item] = count.get(item, 0) + 1
# 场景2:分组(按某属性分组)
from collections import defaultdict
groups = defaultdict(list)
for student in students:
groups[student["class"]].append(student["name"])
# 场景3:配置 / 参数映射
settings = {
"debug": True,
"log_level": "INFO",
"max_retries": 3,
"timeout": 30.0
}
# 场景4:快速查找(代替 if-elif 很多层)
status_code_meaning = {
200: "OK",
404: "Not Found",
500: "Server Error",
429: "Too Many Requests"
}
七、字典 vs 其他数据结构的对比(面试常考)
| 需求 | 推荐结构 | 原因 / 优势 |
|---|---|---|
| 需要按插入顺序遍历 | dict (3.7+) | 原生支持 |
| 需要保持插入顺序且可修改 | dict | — |
| 需要按 key 排序遍历 | sorted(d.items()) | 临时排序 |
| 极大量键值对 + 内存敏感 | slots 类 或 dataclass | 比 dict 省内存 |
| 需要默认值自动创建 | defaultdict | 避免每次判断 key 是否存在 |
| 只做计数统计 | Counter | 提供 most_common() 等便捷方法 |
| key 是整数连续小范围 | list / array | 速度更快、内存更省 |
八、速查口诀(背下来日常效率翻倍)
- 创建:
{}最快 →dict()→dict.fromkeys()→zip - 访问:优先
.get()>in + []>setdefault - 遍历:
for k,v in d.items():是第一选择 - 计数:
d[k] = d.get(k,0) + 1或defaultdict(int) - 更新:
d.update()批量最优雅 - 3.7+:记住“有序”这件事
你目前对字典最困惑的是哪一块?
- 推导式写不出来?
- defaultdict 和普通 dict 的使用边界?
- 排序字典?
- 嵌套字典取值很麻烦?
- 还是想看真实项目中字典的 10 种典型用法?
告诉我你的痛点,我可以继续针对性深入~