Python基础:字典高级操作
文章目录
一、知识点详解
1.1 字典嵌套
字典嵌套是指字典的值本身也是字典(或其它数据结构),形成多层数据结构。适用于存储复杂数据,如配置信息、多级分类数据等。
- 创建方式:直接定义或通过
dict()
构造函数构建,支持动态添加嵌套层级。 - 访问方式:通过多级键名访问,如
nested_dict['user1']['age']
。 - 应用场景:JSON数据处理、员工信息管理、多层级配置。
- 示例:
school = { "class1": { "teacher": "王老师", "students": ["小明", "小红"], "scores": {"语文": 90, "数学": 85} }, "class2": { "teacher": "李老师", "students": ["小刚", "小美"] } } # 访问嵌套数据 print(school["class1"]["scores"]["数学"]) # 85
1.2 字典合并
合并多个字典时,新字典的键会覆盖旧字典的同名键。
常用方法:
update()
:原地更新字典,无返回值。|
操作符(Python 3.9+):生成新字典,代码简洁。
- 示例:
# update() 方法 (修改原字典) default_config = {"color": "红", "size": 12} user_config = {"size": 14, "font": "宋体"} default_config.update(user_config) # user_config覆盖default_config print(default_config) # 输出 : {'color': '红', 'size': 14, 'font': '宋体'} # | 操作符(Python 3.9+) dict1={"name":"张三","age":25} dict2={"age":30,"sex":"男"} merged = dict1 | dict2 # 新值覆盖旧值(生成新字典) print(merged) # 输出 : {'name': '张三', 'age': 30, 'sex': '男'} print(dict1) # 原字典未改变 → {"name":"张三","age":25} print(dict2) # 原字典未改变 → {"age":30,"sex":"男"} # 进阶操作 |= (修改原字典) # dict1 |= dict2 # print(dict1) # 输出 : {'name': '张三', 'age': 30, 'sex': '男'} dict2 |= dict1 print(dict2) # 输出 : {'age': 25, 'sex': '男', 'name': '张三'}
1.3 字典推导式
通过表达式动态生成字典,语法简洁高效。语法类似于列表推导式,但用于生成键值对。
-
基本语法:
{key: value for item in iterable if condition}
-
参数说明:
key
:键的计算表达式value
:值的计算表达式item
:可迭代对象中的每个元素iterable
:可迭代对象condition
:可选条件表达式,用于过滤元素
-
示例:
# 生成数字平方字典 squares = {num: num**2 for num in range(1, 6)} print(squares) # 结果:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25} # 筛选大于3的数 big_nums = {k: v for k, v in squares.items() if v > 9} print(big_nums) # 结果:{4: 16, 5: 25}
1.4 默认值处理
处理缺失键时避免KeyError
,常用方法:
get(key, default)
:安全取值,不修改原字典setdefault(key, default)
:若键不存在,添加键并设默认值collections.defaultdict
:自动为缺失键生成默认值(如defaultdict(int)
)
- 示例:
# 统计单词出现次数 text = "apple banana apple orange" word_count = {} for word in text.split(): word_count[word] = word_count.get(word, 0) + 1 print(word_count) # 输出:{'apple': 2, 'banana': 1, 'orange': 1} word_count.setdefault("grape", 0) # 添加键-葡萄并设默认值为0 print(word_count) # 输出:{'apple': 2, 'banana': 1, 'orange': 1, 'grape': 0}
代码说明(单词统计逻辑拆解):
text.split()
分割字符串为['apple', 'banana', 'apple', 'orange']
- 遍历第一个单词 “apple”:
get("apple", 0)
返回 0,计数变为 1 - 遍历第二个单词 “banana”:
get("banana", 0)
返回 0,计数变为 1 - 遍历第三个单词 “apple”:
get("apple", 0)
返回 1,计数变为 2 - 遍历第四个单词 “orange”:
get("orange", 0)
返回 0,计数变为 1 setdefault("grape", 0)
添加单词 “grape”,并设默认值为 0
1.5 有序字典
Python 3.7+中普通字典默认保持插入顺序,早期版本需用collections.OrderedDict
。
- 特性:遍历时按插入顺序输出键值对,适用于日志记录等顺序敏感场景
- 验证方式:
list(d.keys()) == ['a', 'b', 'c']
- 示例(兼容旧版本):
from collections import OrderedDict today_list = OrderedDict() today_list["任务1"] = "吃饭" today_list["任务2"] = "睡觉" today_list["任务3"] = "打豆豆" print(today_list) # 直接输出的会显示特殊类型标记 OrderedDict # 输出:OrderedDict({'任务1': '吃饭', '任务2': '睡觉', '任务3': '打豆豆'}) print(dict(today_list)) # 转换为普通字典 # 输出: {'任务1': '吃饭', '任务2': '睡觉', '任务3': '打豆豆'}
- 说明: Python 3.7+已经无需这样操作了,此处说明只是为了我们读一些较早的代码时,知道其中的意思。
二、综合示例
from collections import defaultdict
# 1. 字典推导式生成学生成绩
students = {f"stu{i}": {'math': 85 + i, 'english': 90 - i} for i in range(1, 4)}
# 2. stu1 添加嵌套的选修课成绩
students['stu1']['elective'] = {'physics': 95}
# 3. 字典合并(Python 3.9+语法)
student_new = {'stu4': {'math': 88, 'english': 92}}
students |= student_new # 合并新同学成绩字典
# 其他写法
# students = students | student_new
# students.update(student_new)
# 4. defaultdict统计学科总分(跳过嵌套字典)
subject_scores = defaultdict(int)
for stu in students.values():
for subj, score in stu.items():
if isinstance(score, dict): # 过滤嵌套的elective字典
continue
subject_scores[subj] += score
# 5. 按插入顺序遍历(Python 3.7+自动有序)
for name, scores in students.items():
print(f"{name}: {scores}")
# 输出学科总分
print("学科总分:", dict(subject_scores))
关键说明:
defaultdict(int)
:自动为不存在的键生成默认值0,简化计数逻辑(详情见扩展知识部分)isinstance(score, dict)
:判断值是否为字典类型,避免统计嵌套数据
三、知识点总结
- 字典嵌套:处理多层级复杂数据(如配置、JSON)
- 字典合并:
update()
原地修改,|
操作符生成新字典(Python 3.9+) - 字典推导式:一行代码生成/筛选字典,语法高效简洁
- 默认值处理:
get()
安全取值,setdefault()
添加默认键,defaultdict
自动生成默认值 - 有序字典:Python 3.7+原生支持插入顺序,旧版本需
OrderedDict
四、扩展知识
defaultdict
深度解析
defaultdict
是collections
模块提供的字典子类,核心优势是自动处理缺失键,避免KeyError
。
4.1 基本语法与初始化
from collections import defaultdict # 使用先导入模块
d = defaultdict(default_factory) # default_factory为类型或可调用对象
dd_int = defaultdict(int)
→ 默认值0dd_list = defaultdict(list)
→ 默认值空列表[]
dd_set = defaultdict(set)
→ 默认值空集合set()
4.2 核心功能对比
特性 | defaultdict | dict.setdefault() |
---|---|---|
默认值生成 | 自动通过default_factory 生成 | 需显式指定默认值(如[] /0 ) |
代码简洁性 | 更简洁(一行完成初始化+赋值) | 需重复调用方法 |
适用场景 | 统一默认值场景(计数/分组) | 动态指定不同默认值的场景 |
4.3 典型应用案例
-
案例1:高效统计字符频率
text = "hello" count = defaultdict(int) for char in text: count[char] += 1 # 自动初始化不存在的键为0 print(dict(count)) # {'h': 1, 'e': 1, 'l': 2, 'o': 1}
-
案例2:数据分组(列表/集合)
data = [('fruit', 'apple'), ('fruit', 'banana'), ('veg', 'carrot')] grouped_list = defaultdict(list) # 分组为列表 grouped_set = defaultdict(set) # 分组为集合(自动去重) for category, item in data: grouped_list[category].append(item) grouped_set[category].add(item) print(dict(grouped_list)) # {'fruit': ['apple', 'banana'], 'veg': ['carrot']} print(dict(grouped_set)) # {'fruit': {'apple', 'banana'}, 'veg': {'carrot'}}
五、知识点考察题
d1 = {0: 0}
d2 = d1.update({1: 1})
d1 = d1.update({True: 2})
print(d1, d2)
问题:代码输出结果是什么?( )
- A.
{0: 0, 1: 1, True: 2} {0: 0, 1: 1}
- B.
{0: 0, 1: 2} {0: 0, 1: 1}
- C.
{0: 0, 1: 2} None
- D.
None None
答案:D