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 ~…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
