当前位置: 首页 > ds >正文

Python自学12 - 常用数据结构之字典

Python自学12 - 常用数据结构之字典

在 Python 的数据世界中,字典(Dictionary)是一种极具灵活性与实用性的数据结构,它以 “键值对”(Key-Value Pair)的形式存储数据,如同现实生活中的字典 —— 通过 “关键词”(键)快速查找对应的 “解释”(值)。相较于列表(List)依赖索引的线性存储方式,字典凭借哈希表(Hash Table)的底层实现,能实现数据的快速检索、插入与删除,因此在处理关联数据、配置信息、缓存存储等场景中被广泛应用。

本文将从字典的核心特性出发,逐步深入其创建、操作、进阶用法及实践场景,帮助你全面掌握这一必备数据结构。


1️⃣ 字典的基本概念

一、字典的核心特性:为何选择字典?

在学习具体操作前,我们首先需要明确字典与其他数据结构(如列表、元组)的本质区别,理解其独特价值:

  1. 键值对映射关系:字典的核心是 “键” 与 “值” 的一一对应,每个 “键” 必须是唯一的(如同字典中的每个词语不重复),而 “值” 可以是任意数据类型(整数、字符串、列表、甚至另一个字典)。这种映射关系让数据的语义更清晰 —— 例如,用{“name”: “Alice”, “age”: 25}存储用户信息,比列表[“Alice”, 25]更易理解每个元素的含义。

  2. 无序性(Python 3.7 + 为插入有序):在 Python 3.7 版本之前,字典是无序的,即键值对的存储顺序与插入顺序无关;从 Python 3.7 开始,字典新增了 “插入有序” 特性,会保留键值对的插入顺序。但需注意,字典仍不支持通过索引访问元素,只能通过 “键” 获取 “值”。

  3. 可变性与不可哈希键:字典是可变数据类型,允许在创建后添加、删除或修改键值对。但作为 “键” 的元素必须是不可哈希(Hashable) 类型,即不能是列表、字典、集合等可变类型 —— 因为可变类型的哈希值会随内容变化,无法作为稳定的 “检索标识”。常见的合法键包括整数、字符串、元组(元素均为不可哈希类型时)。

  4. 高效的查找性能:由于底层基于哈希表实现,字典的查找操作(通过键获取值)时间复杂度为 O (1),远快于列表的 O (n)(需遍历所有元素)。即使存储数万条数据,通过键查找值也能瞬间完成,这是字典在数据处理中最核心的优势。

  • 定义:字典是由 键(key)值(value) 组成的无序集合。
  • 键的要求:必须是不可变类型(如字符串、数字、元组),且在同一个字典中唯一。
  • 值的类型:可以是任意 Python 对象(数字、字符串、列表、字典等)。

语法:

# 创建字典的两种常见方式
person = {"name": "Tom", "age": 25, "city": "Beijing"}
person2 = dict(name="Tom", age=25, city="Beijing")

2️⃣ 字典的常用操作

2.1 访问与修改

person = {"name": "Tom", "age": 25}# 访问
print(person["name"])       # Tom
print(person.get("city"))   # None(不会报错)# 修改
person["age"] = 26
person["city"] = "Beijing"  # 新增键值对

技巧get() 方法可以避免访问不存在的键时报错,并可设置默认值:person.get("city", "Unknown")


2.2 删除元素

del person["age"]      # 删除指定键
person.pop("city", None)  # 删除并返回值,第二个参数为默认值
person.clear()         # 清空字典

2.3 遍历字典

person = {"name": "Tom", "age": 25, "city": "Beijing"}# 遍历键
for key in person.keys():print(key)# 遍历值
for value in person.values():print(value)# 遍历键值对
for key, value in person.items():print(f"{key}: {value}")

3️⃣ 字典推导式(Dict Comprehension)

字典推导式可以快速生成字典,语法简洁高效。

# 生成平方表
squares = {x: x**2 for x in range(1, 6)}
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 条件过滤
even_squares = {x: x**2 for x in range(1, 6) if x % 2 == 0}
print(even_squares)  # {2: 4, 4: 16}

4️⃣ 字典的高效查找特性

字典底层采用 哈希表(Hash Table) 实现,查找和插入的平均时间复杂度为 O(1)
这意味着即使字典中有成千上万个元素,查找速度依然很快。


5️⃣ 常用方法速查表

方法作用示例
dict.get(key, default)获取值,避免 KeyErrord.get("a", 0)
dict.keys()获取所有键for k in d.keys(): ...
dict.values()获取所有值for v in d.values(): ...
dict.items()获取键值对for k,v in d.items(): ...
dict.update(other)批量更新d.update({"x": 1})
dict.pop(key, default)删除并返回值d.pop("a", None)
dict.setdefault(key, default)获取或设置默认值d.setdefault("a", 0)

6️⃣ 实战案例:统计单词频率

text = "python is great and python is easy"
word_count = {}for word in text.split():word_count[word] = word_count.get(word, 0) + 1print(word_count)
# 输出: {'python': 2, 'is': 2, 'great': 1, 'and': 1, 'easy': 1}

亮点:利用 get() 方法简化计数逻辑,避免 if key in dict 的冗余判断。


7️⃣ 小结

  • 字典是 Python 中最常用的映射类型,适合存储结构化数据。
  • 键必须唯一且不可变,值可以是任意类型。
  • 善用 get()setdefault()、字典推导式等技巧,可以让代码更简洁高效。
  • 底层基于哈希表,查找和插入性能极佳。

💡 进阶建议
在后续学习中,可以深入了解 collections 模块中的 defaultdictOrderedDict,它们能在特定场景下让字典的使用更高效、更灵活。


星哥,如果你愿意,我还可以帮你把这篇文章加上配套的“字典操作思维导图”和“常用方法速查卡片”,方便读者收藏和复习,这样你的博客系列会更有吸引力。
你要我帮你加上这些可视化内容吗?

http://www.xdnf.cn/news/20543.html

相关文章:

  • 基于接口的事件机制
  • python入门常用知识
  • Phthon3 学习记录-0707
  • 积分球的使用——简易版
  • 强化学习入门:从零开始实现DDQN
  • Ai8051 2.4寸320*240 ILI9341 I8080接口驱动
  • 人工智能学习:基于seq2seq模型架构实现翻译
  • 项目初始化上传git
  • Qemu-NUC980(四):SDRAM Interface Controller
  • 什么是“二合一矫平机”?——一篇技术科普
  • 主流的开源协议(MIT,Apache,GPL v2/v3)
  • Qt编程之信号与槽
  • 吴恩达机器学习(八)
  • make时设置链接器选项的2种方法
  • 【操作系统-Day 25】死锁 (Deadlock):揭秘多线程编程的“终极杀手”
  • Zoom AI 技术架构研究:联合式方法与多模态集成
  • 【LeetCode热题100道笔记】翻转二叉树
  • python炒股
  • C++ 20 新增特性以及代码示例
  • 同态加密库(Google FHE)
  • 神经网络的初始化:权重与偏置的数学策略
  • C# WinForm分页控件实现与使用详解
  • B.50.10.09-RPC核心原理与电商应用
  • MATLAB R2025a安装配置及使用教程(超详细保姆级教程)
  • 什么是云手机?
  • Vue3 - Echarts自定义主题引入(Error:ECharts is not Loaded,Error:default ,Error:module)
  • 攻击服务器的方式有哪些,对应的应对策略有哪些?
  • 联邦学习论文分享:Towards Building the Federated GPT:Federated Instruction Tuning
  • Leetcode hot100 最长连续序列
  • rh134第五章复习总结