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   几对键值

几个关键规则:

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"])                # 100

4. 删除元素

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"])    # 5

8. 字典与 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 条件与循环

✈️💬