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 ~…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...