来源:黑马程序员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]
要求:生成字典,键为数字,值为该数字的立方(仅偶数)
- B(
get()访问不存在的键返回 None,不报错) - B(
|运算符中,右边字典的值会覆盖左边的) - ×(
items()返回视图对象,不是列表) - key, value(或
k, v) |(管道运算符)update()和|=都用于合并字典,但|=是 Python 3.9+ 的新语法,两者效果相似但|=更简洁。-
nums = [1, 2, 3, 4, 5] cubes = {x: x**3 for x in nums if x % 2 == 0} print(cubes) # {2: 8, 4: 64}