如何使用Python中的collections模块提供的数据结构,如deque、Counter、OrderedDict等

devtools/2024/10/18 14:13:20/

Python 的 collections 模块提供了一些额外的数据结构,这些数据结构在内置的数据类型(如列表、字典、集合等)的基础上,增加了额外的功能或优化了性能。下面是如何使用 collections 模块中的 dequeCounter 和 OrderedDict 这三种数据结构的简单示例。

1. deque(双端队列)

deque(发音为“deck”)是一个线程安全、快速添加/删除元素于两端的线性容器。它支持从两端快速添加和删除元素,时间复杂度为 O(1)。

 

python复制代码

from collections import deque
# 创建一个 deque
d = deque('ghi')
# 添加元素到右端
d.append('j')
d.append('k')
# 添加元素到左端
d.appendleft('f')
d.appendleft('e')
# 打印 deque
print(d) # 输出: deque(['e', 'f', 'g', 'h', 'i', 'j', 'k'])
# 从右端移除元素
print(d.pop()) # 输出: 'k'
# 从左端移除元素
print(d.popleft()) # 输出: 'e'

2. Counter(计数器)

Counter 是一个字典子类,用于计数可哈希对象。它是一个字典,其中元素被当作字典键,它们的计数被存储为字典值。

 

python复制代码

from collections import Counter
# 创建一个 Counter
c = Counter('gallahad')
# 输出 Counter
print(c) # 输出: Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
# 更新计数器
c.update('admiral')
# 输出更新后的 Counter
print(c) # 输出: Counter({'a': 4, 'd': 2, 'l': 2, 'g': 1, 'm': 1, 'i': 1, 'r': 1, 'h': 1})
# 获取某个元素的计数
print(c['a']) # 输出: 4
# 获取元素计数并删除该元素(如果计数为 0,则不执行删除)
print(c.pop('d')) # 输出: 2
# 输出更新后的 Counter
print(c) # 输出: Counter({'a': 4, 'l': 2, 'g': 1, 'm': 1, 'i': 1, 'r': 1, 'h': 1})

3. OrderedDict(有序字典)

OrderedDict 是一个字典子类,它保持了元素被插入时的顺序。当迭代 OrderedDict 时,元素的顺序与它们被插入时的顺序相同。

 

python复制代码

from collections import OrderedDict
# 创建一个 OrderedDict
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# 迭代并打印 OrderedDict
for key in d:
print(key, d[key])
# 输出:
# foo 1
# bar 2
# spam 3
# grok 4
# 插入一个新的键值对到有序字典的开始
d.move_to_end('foo', last=False)
# 再次迭代并打印
for key in d:
print(key, d[key])
# 输出:
# foo 1
# bar 2
# spam 3
# grok 4

这些数据结构在需要特定功能的场景下非常有用,如需要维护插入顺序的字典、需要快速从两端添加/删除元素的列表,或者需要计数可哈希对象的场景。


http://www.ppmy.cn/devtools/50997.html

相关文章

Android 工程副总裁卸任

Android 工程副总裁卸任 Android工程副总裁Dave Burke宣布,他将辞去领导Android工程的职位,将重心转向“AI/生物”项目。不过,他并没有离开Alphabet,目前仍将担任Android系统开发顾问的角色。 Burke参与了Android系统的多个关键…

WinForm之TCP服务端

目录 一 原型 二 源码 一 原型 二 源码 using System.Net; using System.Net.Sockets; using System.Text;namespace TCP网络服务端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpListener listener null;TcpClient handler null;Ne…

MFC序列号输入框

在MFC(Microsoft Foundation Classes)中创建一个对话框的过程,该对话框用于输入序列号(SN),并具有一些特定的行为,比如自动聚焦到输入框、验证输入规则以及根据输入情况关闭对话框。以下是步骤说…

Redis 数据持久化策略和数据过期策略

01- 你们项目中哪里用到了Redis ? 在我们的项目中很多地方都用到了Redis , Redis在我们的项目中主要有三个作用 : 使用Redis做热点数据缓存/接口数据缓存 使用Redis存储一些业务数据 , 例如 : 验证码 , 用户信息 , 用户行为数据 , 数据计算结果 , 排行榜数据等 使用Redis实…

修改SubVI的LabVIEW默认搜索路径

在启动顶级VI后&#xff0c;LabVIEW可能会遇到找不到subVI的情况。这通常是由于subVI的路径发生了变化或没有被正确配置。 LabVIEW默认搜索路径 默认情况下&#xff0c;LabVIEW会按以下顺序搜索文件位置&#xff08;*表示LabVIEW将搜索子目录&#xff09;&#xff1a; <t…

论文阅读笔记:DepGraph: Towards Any Structural Pruning

论文阅读笔记&#xff1a;DepGraph: Towards Any Structural Pruning 1 背景2 创新点3 方法4 模块4.1 分组4.2 依赖图4.3 网络分解4.4 依赖建模4.4 组级剪枝 5 效果 论文&#xff1a;https://arxiv.org/pdf/2301.12900 代码&#xff1a;https://github.com/VainF/Torch-Prunin…

[数据分析与可视化] 基于Python绘制简单动图

动画是一种高效的可视化工具&#xff0c;能够提升用户的吸引力和视觉体验&#xff0c;有助于以富有意义的方式呈现数据可视化。本文的主要介绍在Python中两种简单制作动图的方法。其中一种方法是使用matplotlib的Animations模块绘制动图&#xff0c;另一种方法是基于Pillow生成…

ACM算法学习路线、清单

入门 模拟、暴力、贪心、高精度、排序 图论 搜索 BFS、DFS、IDDFS、IDA*、A*、双向BFS、记忆化 最短路 SPFA、bellman-fort(队列优化)、Dijkstra(堆优化)、Johnson、Floyd、差分约束、第k短路 树 树的重心和直径、dfs序、树链刨分与动态树、LCA、Prufer编码及Cayley定理…