Python学习之路-字典(Dictionary)学习详解

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}最常用、最直观全版本
2dict() + 关键字参数键是合法标识符时很简洁全版本
3dict([("k1",v1), ("k2",v2)])从列表/元组对创建全版本
4{k:v for k,v in 可迭代对象}字典推导式(最强大)3.0+
5dict.fromkeys(keys, default)快速创建大量相同默认值的键全版本
6dict(zip(keys, values))两个等长列表/元组合并成字典全版本
7collections.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+ 最重要的两个变化(必须知道)

  1. 插入顺序保证(从 3.7 开始官方保证,3.6 是实现细节)
  • 字典按照插入顺序迭代和显示
  • dict.keys()dict.values()dict.items() 也保持插入顺序
  1. 更高效的实现(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) + 1defaultdict(int)
  • 更新:d.update() 批量最优雅
  • 3.7+:记住“有序”这件事

你目前对字典最困惑的是哪一块?

  • 推导式写不出来?
  • defaultdict 和普通 dict 的使用边界?
  • 排序字典?
  • 嵌套字典取值很麻烦?
  • 还是想看真实项目中字典的 10 种典型用法?

告诉我你的痛点,我可以继续针对性深入~

文章已创建 4237

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部