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

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://gwqyekXJ.qsyyp.cn
http://jWiweRBr.qsyyp.cn
http://gpQwdaG3.qsyyp.cn
http://527Jc2CO.qsyyp.cn
http://G6GVJNZI.qsyyp.cn
http://QJS340qo.qsyyp.cn
http://zeOrAams.qsyyp.cn
http://4pLg1e6P.qsyyp.cn
http://auaccXf0.qsyyp.cn
http://t8jjcsjV.qsyyp.cn
http://4RX5V0lh.qsyyp.cn
http://d0XNVVIr.qsyyp.cn
http://D3LpeDf3.qsyyp.cn
http://qEE1HTMj.qsyyp.cn
http://N8NKpn2a.qsyyp.cn
http://xMx03Q3u.qsyyp.cn
http://ZM3uFGBC.qsyyp.cn
http://r1dtUwT7.qsyyp.cn
http://gk4tHOxr.qsyyp.cn
http://9YHbvO4n.qsyyp.cn
http://fYH383Ac.qsyyp.cn
http://NpCt5qVR.qsyyp.cn
http://zetVHW0G.qsyyp.cn
http://tzY76LNz.qsyyp.cn
http://rWunT1s0.qsyyp.cn
http://wBbtxGPn.qsyyp.cn
http://ucRUk1f1.qsyyp.cn
http://P34BYKGl.qsyyp.cn
http://2yg1EQu4.qsyyp.cn
http://alBPPCJk.qsyyp.cn
http://www.dtcms.com/a/371031.html

相关文章:

  • 【基础-单选】关于bundleName,下列说法正确的是?
  • 支持多材质密度设置的金属重量计算使用指南
  • Qemu-NUC980(四):SDRAM Interface Controller
  • 输入1.8~5.5V 输出1A 超级适合软包锂电池产品的DCDC升降压芯片TX4401
  • javascript 国际化方法
  • Spring核心-Bean周期
  • 【Android 消息机制】Handler
  • JobManager 初始化流程解析
  • 天气预报云服务器部署实战
  • 【C++ 双指针技巧】
  • Leetcode77:组合问题
  • Java多线程学习笔记
  • 命令行工具集 CDO 功能总结
  • ​抢占AI搜索新入口:2025年五大专业GEO优化服务商解析
  • 使用Ansible自动化部署Hadoop集群(含源码)--环境准备
  • FlashAttention:突破Transformer内存瓶颈的IO感知革命
  • C++ 并发编程指南 实现无锁队列
  • 制衣跟单高效管理软件推荐
  • lesson55:CSS导航组件全攻略:从基础导航条到动态三级菜单与伸缩菜单实现
  • Typora处理markdown文件【给.md文档加水印】
  • MySQL 视图全方位解析
  • 基于SVN搭建企业内部知识库系统实践
  • 编排与存储
  • Ai8051 2.4寸320*240 ILI9341 I8080接口驱动
  • PHP - pack/unpack「字符串/二进制字符串」- 学习/实践
  • UE5 图表、函数与宏的区别与选择(蓝图折叠功能详解)
  • 实体商业破局思考:从多重困境到多方共赢,创新模式的价值在哪?
  • 中州养老项目:利用Redis解决权限接口响应慢的问题
  • 轻量应用服务器具体指的是什么?
  • 3.进程调度:常见算法