来源:黑马程序员Python基础课程 + Python 3.11官方文档 + 网络资料整理


一、详细讲解

1.1 字典遍历三种方式

Python 字典提供三个核心视图对象,用于遍历键、值或键值对:

person = {"name": "小明", "age": 18, "city": "北京", "job": "工程师"}

# 遍历所有键(最常用)
for key in person:
    print(f"{key}: {person[key]}")

# 遍历所有键(显式)
for key in person.keys():
    print(key)

# 遍历所有值
for value in person.values():
    print(value)

# 遍历键值对(最推荐)
for key, value in person.items():
    print(f"{key}: {value}")

输出:

name: 小明 age: 18 city: 北京 job: 工程师 小明 18 北京 工程师 name: 小明 age: 18 city: 北京 job: 工程师

1.2 items() 视图对象的高级用法

items() 返回的是视图对象,不是列表,具有内存高效的特点:

# 并行遍历两个字典(按键对齐)
dict1 = {"a": 1, "b": 2, "c": 3}
dict2 = {"a": 10, "b": 20, "c": 30}

for (k1, v1), (k2, v2) in zip(dict1.items(), dict2.items()):
    print(f"{k1}={v1}, {k2}={v2}, sum={v1+v2}")

# 判断键是否存在
if "name" in person.keys():
    print("有name键")

# 字典键值对数量
print(f"共 {len(person.items())} 个键值对")

1.3 Python 3.9+ 字典合并运算符

Python 3.9 引入了两个新的字典运算符:

# | 合并运算符(不修改原字典)
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
merged = dict1 | dict2
print(merged)  # {'a': 1, 'b': 3, 'c': 4}  注意:dict2的值会覆盖dict1

# |= 就地合并运算符
dict1 |= dict2
print(dict1)  # {'a': 1, 'b': 3, 'c': 4}

# 对比 update()(Python 3.5+)
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
dict1.update(dict2)
print(dict1)  # {'a': 1, 'b': 3, 'c': 4}

1.4 嵌套字典

字典的值可以是另一个字典,形成嵌套结构:

# 嵌套字典:多个用户的信息
users = {
    "user1": {
        "name": "张三",
        "age": 25,
        "skills": ["Python", "Java"]
    },
    "user2": {
        "name": "李四",
        "age": 30,
        "skills": ["Go", "Rust"]
    }
}

# 访问嵌套数据
print(users["user1"]["name"])           # 张三
print(users["user2"]["skills"][0])      # Go

# 遍历嵌套字典
for user_id, user_info in users.items():
    print(f"\n用户ID: {user_id}")
    for key, value in user_info.items():
        print(f"  {key}: {value}")

# 添加新用户
users["user3"] = {
    "name": "王五",
    "age": 28,
    "skills": ["Python", "Go"]
}

# 修改嵌套值
users["user1"]["age"] = 26
users["user1"]["skills"].append("Go")

1.5 字典推导式

类似列表推导式,字典也有推导式语法:

# 基本字典推导式
nums = [1, 2, 3, 4, 5]
squares = {x: x**2 for x in nums}
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 带条件的字典推导式
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_squares = {x: x**2 for x in nums if x % 2 == 0}
print(even_squares)  # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}

# 键值对互换(值必须可哈希)
original = {"a": 1, "b": 2, "c": 3}
swapped = {v: k for k, v in original.items()}
print(swapped)  # {1: 'a', 2: 'b', 3: 'c'}

# 实际应用:从列表创建频率统计
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
word_freq = {word: words.count(word) for word in set(words)}
print(word_freq)  # {'apple': 3, 'banana': 2, 'orange': 1}

1.6 setdefault() 方法

setdefault() 在键不存在时设置默认值,已存在则返回现有值:

# 基本用法
person = {"name": "小明", "age": 18}

# 键不存在,设置默认值
job = person.setdefault("job", "工程师")
print(person)  # {'name': '小明', 'age': 18, 'job': '工程师'}

# 键已存在,返回现有值,不覆盖
result = person.setdefault("name", "老明")
print(person["name"])  # 小明(未被修改)
print(result)          # 小明

# 实际应用:分组统计
groups = {}
fruits = [("红", "苹果"), ("黄", "香蕉"), ("红", "草莓"), ("黄", "橙子")]
for color, fruit in fruits:
    if color not in groups:
        groups[color] = []
    groups[color].append(fruit)
print(groups)  # {'红': ['苹果', '草莓'], '黄': ['香蕉', '橙子']}

二、背诵版

遍历 → for k,v in d.items() 键列表 → list(d.keys()) 值列表 → list(d.values()) 合并 → d1 | d2(Python 3.9+) 就地合并 → d1 |= d2 嵌套访问 → dict[nested][key] 字典推导式 → {k:v for k,v in d.items() if condition} setdefault → 键不存在设默认值,已存在返回现有值

三、考前记忆

方法/操作 说明 返回值
d.keys() 所有键 dict_keys 视图
d.values() 所有值 dict_values 视图
d.items() 所有键值对 dict_items 视图
d.get(k, default) 安全访问,不报错 值或默认值
d.setdefault(k, v) 键不存在设默认值 现有值或新值
d1 | d2 合并(Python 3.9+) 新字典
d1 |= d2 就地合并 None
{k:v for k,v in d.items()} 字典推导式 字典

四、测试题

1. 单选题: 以下哪个方法能安全获取字典中不存在的键而不报错?

  • A. d["key"]
  • B. d.get("key")
  • C. d["key"] = None
  • D. d.key

2. 单选题: Python 3.9 中,{"a":1} | {"a":2} 的结果是?

  • A. {"a":1}
  • B. {"a":2}
  • C. {"a":1, "a":2}(报错)
  • D. {"a":[1,2]}

3. 判断题: d.items() 返回的是一个列表,可以直接用索引访问。

4. 填空题: 遍历字典所有键值对,应使用 for ______ in d.items()

5. 填空题: 将两个字典合并且不修改原字典,应使用运算符 ______。

6. 简答题: 比较 d.update(other)d |= other 的区别。

7. 代码题: 写出以下数据的字典推导式: 原始列表:[1, 2, 3, 4, 5] 要求:生成字典,键为数字,值为该数字的立方(仅偶数)

  1. Bget() 访问不存在的键返回 None,不报错)
  2. B| 运算符中,右边字典的值会覆盖左边的)
  3. ×items() 返回视图对象,不是列表)
  4. key, value(或 k, v
  5. |(管道运算符)
  6. update()|= 都用于合并字典,但 |= 是 Python 3.9+ 的新语法,两者效果相似但 |= 更简洁。
  7. nums = [1, 2, 3, 4, 5]
    cubes = {x: x**3 for x in nums if x % 2 == 0}
    print(cubes)  # {2: 8, 4: 64}