Python 字典
字典(dict)是 Python 里处理键值对数据的核心工具——和 JSON、配置文件、数据库记录、API 返回值几乎是一一对应。学完字典,你就掌握了 Python 数据处理的入口。
1. 什么是字典?
字典是键值对(key:value)的集合,用花括号 {} 创建。它像一本真正的字典:通过"词条"(key)快速查到"释义"(value)。查找速度极快(O(1)),不管字典多大,查找都是一瞬间。
# 字典:键值对(key:value)的无序集合,用花括号 {} 创建
user = {
"name": "小明",
"age": 20,
"city": "北京"
}
# 空字典
empty1 = {}
empty2 = dict()
# 用 dict() 创建
user2 = dict(name="小红", age=22) # 关键字参数
user3 = dict([("name", "小刚"), ("age", 25)]) # 列表 of 元组
# key 必须是不可变类型(str/int/tuple 都行),value 任意
mixed = {
"name": "小明", # str key
100: "满分", # int key
(0, 0): "原点", # tuple key
"hobbies": ["读书", "编程"] # value 是列表
}
# 查看
print(user) # {'name': '小明', 'age': 20, 'city': '北京'}
print(len(user)) # 3 几对键值几个关键规则:
- key 必须不可变:字符串、数字、元组都行;列表、字典、集合不行(可变)。
- key 唯一:同一个 key 只能对应一个 value,后赋的会覆盖前面的。
- value 任意:可以是任何类型,包括嵌套字典、列表。
- Python 3.7+ 保证插入顺序:字典按 key 添加顺序保留(3.6 是实现细节,3.7 写进规范)。
2. 访问元素
user = {"name": "小明", "age": 20, "city": "北京"}
# 1. 用 [key] 访问,不存在会报 KeyError
print(user["name"]) # 小明
# print(user["email"]) # ❌ KeyError: 'email'
# 2. 用 get() 访问,不存在返回 None(可设默认值)
print(user.get("email")) # None 不报错
print(user.get("email", "未填写")) # 未填写 带默认值
# 3. 用 in 判断 key 是否存在(注意:判断 key 不是 value)
print("name" in user) # True
print("小明" in user) # False ("小明"是 value,不是 key)
# 4. 查看所有 key / value / 键值对
print(user.keys()) # dict_keys(['name', 'age', 'city'])
print(user.values()) # dict_values(['小明', 20, '北京'])
print(user.items()) # dict_items([('name', '小明'), ('age', 20), ('city', '北京')])新手要点:user["email"] 当 key 不存在时会报错(KeyError);user.get("email") 不存在时返回 None,不报错。实际开发优先用 get,更安全。
3. 增加与修改
user = {"name": "小明", "age": 20}
# 1. 修改 / 新增:直接赋值
user["age"] = 21 # key 已存在,修改
user["email"] = "xm@example.com" # key 不存在,新增
print(user)
# 2. update():批量更新(把另一个字典合并进来)
user.update({"city": "上海", "age": 22, "phone": "138xxxx"})
print(user)
# 3. setdefault():key 存在则不动,不存在则设置默认值
user.setdefault("name", "默认名") # name 已存在,不修改
user.setdefault("score", 100) # score 不存在,设为 100
print(user["name"]) # 小明(没被覆盖)
print(user["score"]) # 1004. 删除元素
user = {"name": "小明", "age": 20, "city": "北京", "email": "x@x.com"}
# 1. pop(key):删除并返回对应值
city = user.pop("city")
print(city) # 北京
print(user) # city 已被删除
# pop(key, default):key 不存在时返回 default,不报错
r = user.pop("phone", "没有")
print(r) # 没有
# 2. del:直接删除,不返回值
del user["email"]
print(user) # email 已删
# 3. popitem():删除并返回最后一个键值对(Python 3.7+ 保证插入顺序)
last = user.popitem()
print(last) # ('age', 20)
# 4. clear():清空字典
user.clear()
print(user) # {}5. 遍历字典
user = {"name": "小明", "age": 20, "city": "北京"}
# 1. 直接遍历字典 = 遍历所有 key
for key in user:
print(key)
# 输出: name / age / city
# 2. 遍历 keys
for key in user.keys():
print(key)
# 3. 遍历 values
for value in user.values():
print(value)
# 输出: 小明 / 20 / 北京
# 4. 同时遍历 key 和 value(最常用!)
for key, value in user.items():
print(f"{key}: {value}")
# 输出:
# name: 小明
# age: 20
# city: 北京遍历键值对用 .items() 是 Python 最常见的写法。解包 + f-string,几行代码就能优雅地打印字典内容。
6. 字典推导式
和列表推导式一样,字典也能一行生成。
# 字典推导式:一行生成新字典
# 1. 基本:{key_expr: val_expr for var in 序列}
nums = [1, 2, 3, 4]
squares = {n: n * n for n in nums}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16}
# 2. 带条件
evens = {n: n * n for n in nums if n % 2 == 0}
print(evens) # {2: 4, 4: 16}
# 3. 翻转 key 和 value(假设 value 唯一)
original = {"a": 1, "b": 2, "c": 3}
flipped = {v: k for k, v in original.items()}
print(flipped) # {1: 'a', 2: 'b', 3: 'c'}
# 4. 统计字符出现次数(配合字符串)
text = "hello"
counts = {ch: text.count(ch) for ch in set(text)}
print(counts) # {'h': 1, 'e': 1, 'l': 2, 'o': 1}7. Counter:专业的计数器
统计元素出现次数是常见需求,Python 标准库 collections.Counter 是专门工具。
# collections.Counter:专门的"计数器",统计元素出现次数
from collections import Counter
text = "the quick brown fox jumps over the lazy dog the"
words = text.split()
counter = Counter(words)
print(counter)
# Counter({'the': 3, 'quick': 1, 'brown': 1, ...})
# 取出现次数最多的 n 个
print(counter.most_common(2)) # [('the', 3), ('quick', 1)]
# 统计字符
chars = Counter("abracadabra")
print(chars) # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
print(chars["a"]) # 58. 字典与 JSON(实战必备)
Python 字典和 JSON 在结构上几乎一样(都是键值对)。Web 开发、API 调用、配置文件都离不开它们的互转。
import json
# Python 字典和 JSON 格式天然契合,互转极简单
# 1. 字典 -> JSON 字符串
user = {"name": "小明", "age": 20, "hobbies": ["读书", "编程"]}
json_str = json.dumps(user, ensure_ascii=False, indent=2)
print(json_str)
# 输出:
# {
# "name": "小明",
# "age": 20,
# "hobbies": ["读书", "编程"]
# }
# 2. JSON 字符串 -> 字典
data = '{"name": "小红", "scores": [85, 90, 78]}'
parsed = json.loads(data)
print(parsed["name"]) # 小红
print(parsed["scores"][1]) # 90
# 3. JSON 文件读写
with open("user.json", "w", encoding="utf-8") as f:
json.dump(user, f, ensure_ascii=False, indent=2)
with open("user.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded) # {'name': '小明', ...}几个细节:ensure_ascii=False 让中文正常显示(否则会被转成 \\uXXXX);indent=2 让输出带缩进、可读性更好。
9. 嵌套字典(实战常见)
# API 返回的数据经常是多嵌套字典
response = {
"status": "ok",
"data": {
"users": [
{"id": 1, "name": "小明", "scores": {"math": 90, "english": 85}},
{"id": 2, "name": "小红", "scores": {"math": 78, "english": 92}}
]
}
}
# 一层一层访问
users = response["data"]["users"]
for u in users:
math = u["scores"]["math"]
print(f"{u['name']} 数学:{math}")
# 输出:
# 小明 数学:90
# 小红 数学:78
# 安全访问(用 get,避免 KeyError)
name = response.get("data", {}).get("users", [{}])[0].get("name", "未知")处理嵌套字典时,善用 get + 默认值 {} 或 [],能避免大量 KeyError。
小结
字典是 Python 数据处理的核心。重点掌握:访问(优先 get)、增删改(直接赋值 / pop / update)、遍历 items()、字典推导式、JSON 互转(实战必用)、嵌套字典安全访问。下一篇看条件与循环——让程序学会判断和重复。
← 上一篇 Python 元组
下一篇 Python 条件与循环 →