9.5 字典类型

(dict)是 Python 中最重要的数据结构之一,用于存储“键—值”(key–value)对应关系。它是一种可变的映射类型,键必须唯一且可哈希;从 Python 3.7 起(语言规范保证),字典保留插入顺序,这使得许多操作更加可预测。字典可高效实现查找、计数、配置管理等任务。

与列表不同,字典通过键(key)而不是索引来访问数据。

9.5.1 字典的创建

字典可通过花括号 {} 、构造函数 、以及等多种方法创建。

empty = {}

• 键(key)必须是可哈希(hashable)的对象,通常是不可变类型(如字符串、数值、元组等)。注意:元组只有当其所有元素也都是可哈希时才可作为键。frozenset 也是可哈希的集合类型,可作为键。

• 值(value)可以是任意类型,甚至包含列表、字典或函数等可变对象。

9.5.2 字典的常用操作与方法

字典可实现键值访问、更新、删除、遍历与合并等多种,还提供丰富的用于高效管理数据。

(1)访问与修改

使用键名访问对应的值,若键不存在,.get() 可避免抛出 KeyError。

print(student)  # {'name': '小艾', 'score': 98, 'class': 'A1'}

(2)删除操作

Python 提供多种方式删除字典元素(需注意这些方法的返回值与副作用)。

print(data)  # {}

说明:.pop() 可指定默认值避免 KeyError,如 data.pop("x", None)。

(3)成员判断与长度

print(len(person))        # 字典包含的键值对数量

(4)遍历

通过 .keys()、.values()、.items() 可分别遍历键、值或键值对。

    print(f"{k} -> {v}")

说明:.items() 返回的元素是 (键, 值) 形式的元组,可在循环中直接拆包。

(5)合并与更新

使用 .update() 原地合并两个字典。从 Python 3.9 起,也可用 | 运算符返回新字典。若键冲突,后者会覆盖前者的值。

print(merged)    # {'lr': 0.001, 'batch': 64, 'epochs': 10, 'device': 'cuda'}

(6)安全插入:setdefault()

当键不存在时 .setdefault() 方法自动添加默认值,并返回该键对应的值(存在则直接返回现有值)。适合在分组统计中使用。

print(scores)    # {'小艾': [95, 88], '小包': [90]}

说明:相比手动判断是否存在键,.setdefault() 更简洁高效。但当默认值是可变对象时要注意共享引用问题。

(7)拷贝

字典的赋值只是复制引用,若要复制内容,可使用浅拷贝或深拷贝。

print("原字典未变:", a)   # {'x': 1, 'y': [2, 3, 4]}

说明:浅拷贝只复制外层对象,深拷贝会递归复制所有内部元素。

当字典中包含可变对象(如列表或嵌套字典)时,应使用 deepcopy() 以避免相互影响。

(8)排序与解包

字典本身不可直接“按序”重排,但可通过 等函数获取排序后的视图。

print(extended)  # {'a': 1, 'b': 2}

说明:sorted() 对字典的默认行为是对键排序;若按值排序可用 sorted(d.items(), key=lambda x: x[1])。

解包 {**a, **b} 常用于合并配置或参数表,后者会覆盖前者同名键。

(9)统计与计数

结合 .get() 方法可以手动高效统计频次。

# {'AI': 3, 'Python': 1, 'Code': 1}

说明:在生产环境中也可考虑使用 .Counter。

9.5.3 字典综合示例与应用

例 9.5.1:通讯录管理器

字典非常适合存储“键值一一对应”的信息,如姓名与电话号码的映射。

print("更新后的通讯录:", contacts)

说明:字典在查找操作上具有极高效率,非常适合构建通讯录、配置表、索引映射等结构。

例 9.5.2:商品库存统计系统

通过字典可轻松管理商品与库存数量的映射关系,并支持动态更新与汇总。

    print(f"{item}:{count} 个")

说明:该示例展示了字典在动态数据管理中的典型应用,如库存管理、销售记录或资源计数。在实际开发中,这类字典常与文件或数据库交互,用于实时同步业务数据。

9.6 组合数据的嵌套与综合应用

嵌套与组合是数据结构的高阶应用。通过合理使用列表、元组、集合与字典,可以构建复杂的数据模型,并结合函数或类实现更高层次的抽象能力。

例 9.6.1:学生成绩管理系统

一个学生可以有多门课程成绩,可用字典与列表嵌套表示。

    print(f"{name} 的平均成绩:{average(scores):.1f}")

输出:

鞠子舟 的平均成绩:92.7

此示例结合了字典(键值映射)、列表(序列存储)与函数调用(结构化计算),展示了嵌套数据在实际数据管理中的常见用法。

例 9.6.2:AI 模型参数配置表

在人工智能开发中,模型配置文件通常以嵌套字典形式存储,便于统一管理不同模块参数。

print("训练轮次:", config["training"]["epochs"])  

输出:

训练轮次: 10

嵌套字典是一种常见的数据描述结构,可轻松转换为 文件,用于深度学习模型配置、超参数管理或日志记录。

例 9.6.3:模型训练日志分析器

在机器学习实验中,我们常使用字典与列表来记录训练过程中的多组指标(如损失 loss、准确率 accuracy)。

通过组合数据结构,可以轻松统计与可视化模型性能趋势。

analyze_logs(logs)

输出:

最高准确率:86.00%

说明:此示例结合了列表(顺序存储多轮训练记录) 与 字典(保存每轮的指标),展示了如何组织结构化数据以便分析。

在实际 AI 项目中,可扩展为读取 JSON 训练日志、绘制学习曲线或自动记录实验结果。

小结

本次课系统学习了 Python 的字典(dict)类型,掌握了字典的创建方法、访问与修改技巧、常用方法,并通过综合示例了解了字典在通讯录管理、库存系统、模型配置与日志分析等应用场景中的强大作用。

在下一课中,我们将学习文件操作(File I/O),了解如何将这些内存中的数据包括列表、字典等保存到外部文件(如 .txt、.csv、.json),从而实现数据的持久化存储与跨程序共享。

打开网易新闻 查看精彩图片

点赞有美意,赞赏是鼓励