Python基础 : 字典高级操作

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 字典合并

合并多个字典时,新字典的键会覆盖旧字典的同名键。

常用方法

  1. update():原地更新字典,无返回值。
  2. | 操作符(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,常用方法:

  1. get(key, default):安全取值,不修改原字典
  2. setdefault(key, default):若键不存在,添加键并设默认值
  3. 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}  
    

代码说明(单词统计逻辑拆解):

  1. text.split() 分割字符串为 ['apple', 'banana', 'apple', 'orange']
  2. 遍历第一个单词 “apple”:get("apple", 0) 返回 0,计数变为 1
  3. 遍历第二个单词 “banana”:get("banana", 0) 返回 0,计数变为 1
  4. 遍历第三个单词 “apple”:get("apple", 0) 返回 1,计数变为 2
  5. 遍历第四个单词 “orange”:get("orange", 0) 返回 0,计数变为 1
  6. 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):判断值是否为字典类型,避免统计嵌套数据

三、知识点总结

  1. 字典嵌套:处理多层级复杂数据(如配置、JSON)
  2. 字典合并update()原地修改,|操作符生成新字典(Python 3.9+)
  3. 字典推导式:一行代码生成/筛选字典,语法高效简洁
  4. 默认值处理get()安全取值,setdefault()添加默认键,defaultdict自动生成默认值
  5. 有序字典:Python 3.7+原生支持插入顺序,旧版本需OrderedDict

四、扩展知识

defaultdict深度解析

defaultdictcollections模块提供的字典子类,核心优势是自动处理缺失键,避免KeyError

4.1 基本语法与初始化
from collections import defaultdict  # 使用先导入模块
d = defaultdict(default_factory)  # default_factory为类型或可调用对象  
  • dd_int = defaultdict(int) → 默认值0
  • dd_list = defaultdict(list) → 默认值空列表[]
  • dd_set = defaultdict(set) → 默认值空集合set()
4.2 核心功能对比
特性defaultdictdict.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


关注公众号「安于欣」获取更多Python技巧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值