10种 Python数据结构,从入门到精通
今天我们将深入探讨 Python 中常用的数据结构,帮助你从基础到精通。每种数据结构都有其独特的特点和适用场景,通过实际代码示例和生活中的比喻,让你更容易理解这些概念。
学习数据结构的三个阶段
1、掌握基本用法:使用这些数据结构解决一些基本问题。
2、应用场景选择:知道在何种场景下选用哪种数据结构。
3、深入理解实现:了解内置数据结构的源码实现,并将其与相关算法知识联系起来,提升编程能力。
下面逐一介绍这 10 种常用的数据结构。
1. List (列表)
基本用法
list 是 Python 中最基本的数据结构,允许存储多个值且支持动态大小。
# 创建一个列表
fruits = ['apple', 'banana', 'cherry']
print(fruits[0]) # 输出:apple# 添加元素
fruits.append('orange')
print(fruits) # 输出:['apple', 'banana', 'cherry', 'orange']# 修改元素
fruits[1] = 'kiwi'
print(fruits) # 输出:['apple', 'kiwi', 'cherry', 'orange']# 删除元素
fruits.remove('cherry')
print(fruits) # 输出:['apple', 'kiwi', 'orange']
使用场景
-
适合频繁查询和修改:例如,在需要按索引访问元素时,list 的性能优越。
-
不适合频繁插入和删除:特别是在开头插入或删除时,因为这样会导致后面的元素都要移动。
实现原理
list 底层是动态数组,初始状态下无需指定长度。当插入元素超过初始容量时,会进行扩容,通常是以两倍的方式增加大小。删除操作尤其在列表开头执行时,由于涉及大量元素的位移,因此时间复杂度为 O(n)。
2. Tuple (元组)
基本用法
tuple 是一种不可变的序列,一旦创建便无法修改。
# 创建一个元组
coordinates = (10, 20)
print(coordinates[0]) # 输出:10# 元组解包
x, y = coordinates
print(x, y) # 输出:10 20
使用场景
-
确保数据不被修改:如果确定对象不会被修改(比如坐标),可以使用元组。
-
节省内存:由于元组的不可变性,Python 在内存管理上更高效。
from sys import getsizeof
print(getsizeof(list())) # 输出:72
print(getsizeof(tuple())) # 输出:56
实现原理
tuple 是一种静态数组,不支持动态扩展,其存储方式相较于 list 更加紧凑,因此在同等条件下占用的内存更少。
3. Set (集合)
基本用法
set 是一种无序且不重复的集合,主要用于去重和集合运算。
# 创建一个集合
a = [3, 2, 5, 2, 5, 3]
unique_values = set(a)
print(unique_values) # 输出:{2, 3, 5}# 集合操作
b = {3, 4, 6, 2}
intersection = unique_values.intersection(b) # 求交集
print(intersection) # 输出:{2, 3}
使用场景
-
去除重复元素:例如,统计购物车中的唯一商品。
-
快速查找:适合快速判断某个元素是否存在。
实现原理
set 通过哈希表实现,采用哈希函数将元素映射到固定的索引,增删查操作平均时间复杂度为 O(1),因此效率极高。
4. Dict (字典)
基本用法
dict 是基于键-值对数据结构,广泛用于数据存储和检索。
# 创建字典
d = {'a': 1, 'b': 2}
print(d['a']) # 输出:1# 添加元素
d['c'] = 3
print(d) # 输出:{'a': 1, 'b': 2, 'c': 3}# 修改元素
d['b'] = 5
print(d) # 输出:{'a': 1, 'b': 5, 'c': 3}# 删除元素
del d['a']
print(d) # 输出:{'b': 5, 'c': 3}
使用场景
-
高效查询:适合需要快速查找的场景,如用户信息存储。
-
统计数据:比如计算字符串中字符出现次数的场景。
text = "hello world"
count_dict = {}
for char in text:count_dict[char] = count_dict.get(char, 0) + 1
print(count_dict) # 输出:{'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
实现原理
dict 实际上是哈希表实现,基于键值对存储数据,查找、插入和删除操作的平均时间复杂度是 O(1)。不过,由于哈希表的设计,字典在内存上相对消耗较大。
5. Deque (双端队列)
基本用法
deque 是双端队列,支持从左右两边高效地添加和删除元素。
from collections import deque# 创建一个双端队列
d = deque([3, 2, 4])
d.appendleft(1) # 从左侧添加元素
print(d) # 输出:deque([1, 3, 2, 4])# 从右侧添加元素
d.append(5)
print(d) # 输出:deque([1, 3, 2, 4, 5])# 从左侧删除元素
d.popleft()
print(d) # 输出:deque([3, 2, 4, 5])
使用场景
-
需要频繁在两端进行操作的场景:如任务调度、回溯算法等。
实现原理
deque 是一个双向链表,因此在两端进行操作时,时间复杂度都是 O(1)。它内部维护了一个数组和链表的数据结构,使得存取操作灵活且高效。
6. Counter (计数器)
基本用法
Counter 是用于计数的容器,可以轻松统计元素出现的频率。
from collections import Counter# 创建 Counter
c = Counter(['apple', 'orange', 'apple', 'banana'])
print(c) # 输出:Counter({'apple': 2, 'orange': 1, 'banana': 1})# 获取最常见的元素
most_common = c.most_common(2) # 前两个常见元素
print(most_common) # 输出:[('apple', 2), ('orange', 1)]
使用场景
-
统计频次:分析文本数据、用户行为等,找出最常见的项。
实现原理
Counter 继承自 dict,其实现简单明了,将元素作为键,出现的次数作为值,方便快速统计和查询。
7. OrderedDict (有序字典)
基本用法
OrderedDict 是一个保持插入顺序的字典。
from collections import OrderedDictod = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3for k, v in od.items():print(k, v) # 输出:a 1, b 2, c 3
使用场景
-
需要保持元素插入顺序的场景:如任务调度、配置文件解析等。
实现原理
OrderedDict 内部维护了一个双向链表来记录元素的插入顺序,同时还能保证 O(1) 的插入、删除和查找效率。
8. Heapq (堆队列)
基本用法
heapq 提供了堆队列算法,支持高效的优先级队列实现。
import heapqa = [3, 1, 4, 2]
heapq.heapify(a) # 建堆
print(a[0]) # 输出:1,最小元素# 获取前 3 个最大元素
largest = heapq.nlargest(3, a)
print(largest) # 输出:[4, 3, 2]# 获取前 3 个最小元素
smallest = heapq.nsmallest(3, a)
print(smallest) # 输出:[1, 2, 3]
使用场景
-
需要经常获取最小或最大值的场景:如实时数据处理、任务调度等。
实现原理
堆是一种特殊的完全二叉树,其中父节点的值小于子节点(最小堆)。heapq 模块使用数组实现堆,能够很方便地维持堆的性质。
9. Defaultdict (默认字典)
基本用法
defaultdict 是一种带默认值的字典,避免了键不存在时的 KeyError。
from collections import defaultdictd = defaultdict(int) # 默认值为 0
d['apple'] += 1
d['banana'] += 2
print(d) # 输出:defaultdict(<class 'int'>, {'apple': 1, 'banana': 2})# 添加列表作为默认值
dd = defaultdict(list)
words = ['book', 'nice', 'great', 'book']
for i, word in enumerate(words):dd[word].append(i)
print(dd) # 输出:defaultdict(<class 'list'>, {'book': [0, 3], 'nice': [1], 'great': [2]})
使用场景
-
适合需要自动初始化的字典:如频率统计、分组归类等场景。
实现原理
defaultdict 是对 dict 的扩展,当访问一个未定义的键时,会调用默认工厂函数生成一个默认值,避免了显式的检查。
10. ChainMap (链式映射)
基本用法
ChainMap 用于将多个字典组合为一个字典视图,支持同时查找。
from collections import ChainMapd1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
cm = ChainMap(d1, d2)print(cm['b']) # 输出:2,取自 d1
print(cm['c']) # 输出:4,取自 d2# 修改键值对
cm['b'] = 5
print(d1) # 输出:{'a': 1, 'b': 5}, d1 被修改
使用场景
-
合并多个字典并希望同步更改的场景:如配置文件管理、环境变量设置等。
实现原理
ChainMap 将多个字典视为一个单一的映射,每次查找首先会检查第一个字典,如果没有找到,再查找下一个,这使得多个字典的合并变得简单而高效。
总结
本文详细介绍了 Python 中的 10 种常用数据结构,并结合了代码示例和实际场景解析,希望能帮助读者加深对这些数据结构的理解。在实际开发中,合理选择数据结构能够显著提升代码的效率和可读性。如果觉得这篇文章对你有帮助,请转发、点赞或收藏,以支持我们继续原创!
相关文章:
10种 Python数据结构,从入门到精通
今天我们将深入探讨 Python 中常用的数据结构,帮助你从基础到精通。每种数据结构都有其独特的特点和适用场景,通过实际代码示例和生活中的比喻,让你更容易理解这些概念。 学习数据结构的三个阶段 1、掌握基本用法:使用这些数据结…...
【AI】人工智能时代,程序员如何保持核心竞争力?
目录 程序员在AI时代的应对策略1. 引言2. AI在编程领域的影响2.1 AI辅助编程工具的现状2.2 AI对编程工作的影响2.3 程序员的机遇与挑战 3. 深耕细作:专注领域的深度学习3.1 专注领域的重要性3.2 深度学习的策略3.2.1 选择合适的领域3.2.2 持续学习和研究3.2.3 实践与…...
WPF学习(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)
WrapPanel控件(瀑布流布局) WrapPanel控件表示将其子控件从左到右的顺序排列,如果第一行显示不了,则自动换至第二行,继续显示剩余的子控件。我们来看看它的结构定义: public class WrapPanel : Panel {pub…...
【python】Python中实现定时任务常见的几种方式原理分析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
老公请喝茶,2024年老婆必送老公的养生茶,暖暖的很贴心
在这个快节奏的时代,每个人都在为生活奔波,而家的温馨与关怀,成了我们最坚实的后盾。随着2024年的已经过半,作为妻子,你是否也在寻找一份特别的礼物,来表达对老公深深的爱意与关怀?在这个充满爱…...
3d打印相关资料
模型库 拓竹makerworld爱给...
MySQL1 DDL语言
安装与配置 官网: MySQL :: Download MySQL Installer 阿里云: MySQL8 https://www.alipan.com/s/auhN4pTqpRp 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速…...
el-tree懒加载状态下实现搜索筛选(纯前端)
1.效果图 (1)初始状态 (2)筛选后 2.代码 <template><div><el-inputplaceholder"输入关键字进行过滤"v-model"filterText"input"searchValue"></el-input><el-tree…...
NLP——Transfromer 架构详解
Transformer总体架构图 输入部分:源文本嵌入层及其位置编码器、目标文本嵌入层及其位置编码器 编码器部分 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 第二个子层连接结构包…...
大模型算法面试题(二十)
本系列收纳各种大模型面试题及答案。 1、描述Encoder和Decoder中Attention机制的不同之处 Encoder和Decoder中的Attention机制在自然语言处理(NLP)和序列到序列(Seq2Seq)模型中扮演着重要角色,它们虽然都利用了Attent…...
2024最新最全面的Selenium 3.0 + Python自动化测试框架
文档说明 Selenium是一个用于Web应用程序自动化测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。 Selenium测试的主要功能包括: 测试与浏览器的兼容性:测试应用程序是否能很好的工作在不同的浏览器和操作系统之上。…...
海运中的甩柜是怎么回事❓怎么才能避免❓
什么是甩柜? 甩柜又叫甩箱,是指集装箱船在起运离港时,船公司没有将此前计划装船的集装箱装运上船,导致部分货物滞留港口。多出现在海运旺季。 为什么会甩柜? 甩箱是集装箱物流中常见的事件,主要因为承运…...
Win11+docker+gpu+vscode+pytorch配置anomalib(2)
在上一篇文章中,我在Win11上通过Docker配置了pytorch,并顺利调用了GPU。在这篇文章中,我将继续完成anomalib的配置。 anomalib是一个非常完善的异常检测框架,我希望通过它来学习经典异常检测算法,并且测试这些算法在我自己的数据集上的效果。 步骤如下: 1. 从docker Hub上…...
AI在招聘市场趋势分析中的应用
一、引言 在数字化、智能化的时代背景下,人工智能(AI)技术正逐步渗透到各行各业,其中招聘市场也不例外。AI技术的运用不仅极大地提高了招聘的效率和精准度,还在招聘市场趋势分析方面展现出巨大的潜力。本文旨在探讨AI在…...
AMEYA360:太阳诱电应对 165℃的叠层金属类功率电感器实现商品化!
太阳诱电株式会社实现了可以满足车载被动部件认定的可靠性试验规格“AEC-Q200”的叠层金属类功率电感器 MCOIL™“LACNF2012KKTR24MAB”(2.0x1.25x1.0mm,高度为最大值)等 4 个产品的商品化。通过本公司独有的金属类材料和叠层工艺的提高,在叠层金属类功率…...
Nginx进阶-常见配置(三)
nginx 变量 Nginx的配置文件使用的语法的就是一门微型的编程语言。既然是编程语言,一般也就少不了“变量”这种东西。 Nginx配置文件使用的语法主要包括以下几个方面: (1)配置块 (Block Directives): Nginx配置文件由多个嵌套的…...
开源协作式书签管理器推荐
不知道有没有人和我一样,不怎么爱用app,反而喜欢保留用古老的浏览器浏览新闻和知识的习惯。那么归档网页和书签一定是你非常头疼的事情。 推荐一款开源软件:Linkwarden ,这是一款独立的开源协作式书签管理器。 Linkwarden 允许用户收集、组…...
【线性代数】【二】2.2极大线性无关组与向量空间的基
文章目录 前言一、极大线性无关组二、向量空间的基三、向量维数与向量空间维数总结 前言 上一篇中我们介绍了向量空间的概念,并且学习了对任意给出的一组向量,如果构造一个向量空间。本文将更加细致的去分析张成一个向量空间,具有哪些性质。…...
STM32常见的下载方式有三种
经过对比,推荐使用 SWD下载,只需要一个仿真器(如jLINK、ST LINK、 CMSIS DAP 等),比较方便。 不推荐使用串口下载(速度慢、无法仿真和调试)和 JTAG 下载(占用 IO 多)。...
RK3568-npu模型转换推理
1. rknn-toolkit2-1.4.0进行模型转换和模型推理 1.1 虚拟机转换和模拟器推理(要求ubuntu18+python3.6) sudo apt-get install python3 python3-dev python3-pip sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc cd ~…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...
【Linux】使用1Panel 面板让服务器定时自动执行任务
服务器就是一台24小时开机的主机,相比自己家中不定时开关机的主机更适合完成定时任务,例如下载资源、备份上传,或者登录某个网站执行一些操作,只需要编写 脚本,然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...
十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】
一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下核心特性: 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...
