首页 / Python3 入门教程 / 字典

Python3 入门教程

字典

本教程共 70 篇 · 第 14 篇 · 更新于 2026-07-22 · 约 2 分钟阅读

PythonPython3 入门教程Python 字典字典推导式defaultdict可哈希

14. 字典

本节目标:掌握字典的增删改查、遍历和推导式,能用它高效存储和查找键值对数据。

字典是什么

字典(dict)是 Python 最常用的数据结构之一,用来存储「键值对」(key-value)。

person = {
    "name": "Alice",
    "age": 25,
    "city": "Beijing"
}

每个键对应一个值,通过键来查找值,速度极快(接近 O(1))。

Note

字典的键必须是不可变类型:字符串、数字、元组都可以,列表不行。

创建字典

# 字面量创建
d1 = {"a": 1, "b": 2}

# 空字典
d2 = {}
d3 = dict()

# 从键值对序列创建
d4 = dict([("a", 1), ("b", 2)])

# 关键字参数创建
d5 = dict(a=1, b=2)

# 从两个序列创建(键和值配对)
keys = ["a", "b", "c"]
values = [1, 2, 3]
d6 = dict(zip(keys, values))

增删改查

访问值

>>> d = {"name": "Alice", "age": 25}
>>> d["name"]
'Alice'
>>> d["gender"]          # 键不存在会报错
KeyError: 'gender'

安全访问的两种方式:

# 方式一:先判断
if "gender" in d:
    print(d["gender"])

# 方式二:用 get(),不存在时返回 None(或指定默认值)
>>> d.get("gender")           # None
>>> d.get("gender", "unknown")   # 'unknown'

添加和修改

>>> d["gender"] = "female"    # 添加新键值对
>>> d["age"] = 26             # 修改已有键的值
>>> d
{'name': 'Alice', 'age': 26, 'gender': 'female'}

删除

>>> d = {"a": 1, "b": 2, "c": 3}

# 删除指定键(并返回值)
>>> d.pop("b")
2
>>> d
{'a': 1, 'c': 3}

# 删除并返回最后插入的键值对(Python 3.7+)
>>> d.popitem()
('c', 3)

# 清空
>>> d.clear()
>>> d
{}

# 用 del 删除键
del d["a"]

遍历字典

>>> d = {"name": "Alice", "age": 25, "city": "Beijing"}

# 遍历键(默认)
>>> for key in d:
...     print(key)
name
age
city

# 遍历值
>>> for value in d.values():
...     print(value)
Alice
25
Beijing

# 遍历键值对
>>> for key, value in d.items():
...     print(f"{key}: {value}")
name: Alice
age: 25
city: Beijing
Tip

需要同时遍历索引、键、值时,用 enumerate

for i, (k, v) in enumerate(d.items()):
    print(i, k, v)

字典的合并与更新

Python 3.9+ 支持用 | 合并字典:

>>> d1 = {"a": 1, "b": 2}
>>> d2 = {"b": 3, "c": 4}
>>> d1 | d2
{'a': 1, 'b': 3, 'c': 4}    # 后面的值覆盖前面的

老版本用 update()

>>> d1 = {"a": 1}
>>> d1.update({"b": 2, "c": 3})
>>> d1
{'a': 1, 'b': 2, 'c': 3}

字典推导式

和列表推导式类似,可以一行生成字典:

# 平方数映射
>>> {x: x**2 for x in range(5)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 从已有字典筛选
>>> prices = {"apple": 3, "banana": 2, "cherry": 8}
>>> {k: v for k, v in prices.items() if v > 2}
{'apple': 3, 'cherry': 8}

# 交换键值(值必须可哈希才能当键)
>>> {v: k for k, v in {"a": 1, "b": 2}.items()}
{1: 'a', 2: 'b'}

setdefault:一键设置默认值

setdefault 在键不存在时设置默认值,存在时返回原值:

>>> d = {"a": 1}
>>> d.setdefault("a", 100)    # 键已存在,返回原值
1
>>> d.setdefault("b", 2)      # 键不存在,设置并返回
2
>>> d
{'a': 1, 'b': 2}

这在按类别分组时特别有用:

>>> data = [("fruit", "apple"), ("fruit", "banana"), ("veg", "carrot")]
>>> groups = {}
>>> for category, item in data:
...     groups.setdefault(category, []).append(item)
>>> groups
{'fruit': ['apple', 'banana'], 'veg': ['carrot']}

collections.defaultdict

标准库提供了更优雅的版本:

from collections import defaultdict

groups = defaultdict(list)
for category, item in data:
    groups[category].append(item)

访问不存在的键时,自动用 list() 创建空列表,省去 setdefault 的繁琐。

字典的键必须可哈希

字典在底层基于哈希表实现,所以键必须是不可变且可哈希的:

>>> hash("hello")
-123456789  # 具体值因运行环境而异
>>> hash((1, 2))
某整数值
>>> hash([1, 2])
TypeError: unhashable type: 'list'

想以列表内容当键?转成元组就行:

>>> d = {}
>>> key = tuple([1, 2, 3])
>>> d[key] = "value"

来源:参考了 runoob「Python3 字典」、liaoxuefeng「使用 dict 和 set」、w3cschool「Python3 字典」等,改写后所得。