详解collections库常用的数据结构

        python的collections库是一个内置模块,提供了除列表、字典、元组和集合等通用数据结构之外的几种数据结构,这些数据结构在某些情况下对数据的处理更为高效。在算法开发或者刷leetcode题的过程中,熟练掌握以下数据结构往往能够事半功倍。

一、deque

        deque(双端队列)是一个线程安全、可以快速从两端添加或删除元素的双向列表。deque可以创建一个固定长度的队列,当队列满时,自动删除最旧的元素(设置maxlen参数),这意味着可以用于实现简单的缓存机制或者处理滑动窗口。此外,deque提供了rotate方法,可以将队列中的元素向左或向右旋转,reverse方法则可以原地反转队列中的元素。

from collections import deque# 初始化deque实例,设置最大容量为3
d = deque([1, 2, 3], maxlen=3)
print(d) # deque([1, 2, 3], maxlen=3)# 弹出队列最后一个元素
d.pop()
print(d) # deque([1, 2], maxlen=3)# 弹出队列头部第一个元素
d.popleft()
print(d) # deque([2], maxlen=3)# 在队列后面插入一个元素
d.append(3)
print(d) # deque([2, 3], maxlen=3)# 在队列头部插入一个元素
d.appendleft(1)
print(d) # deque([1, 2, 3], maxlen=3)# 向右旋转队列中的数字(相当于每个元素向右位移n位)
d.rotate(1)
print(d) # deque([3, 1, 2], maxlen=3)# 向左旋转队列中的数字(每个元素左移n位)
d.rotate(-1)
print(d) # deque([1, 2, 3], maxlen=3)# 反转整个队列
d.reverse()
print(d) # deque([3, 2, 1], maxlen=3)# 往队列后面插入一个新的元素,但由于队列最大长度为3,队列头部的元素将被去除
d.append(0)
print(d) # deque([2, 1, 0], maxlen=3)# # 往队列头部插入一个新的元素,但由于队列最大长度为3,队列最后面的元素将被去除
d.appendleft(3)
print(d) # deque([3, 2, 1], maxlen=3)

二、Counter

        Counter是一个计数器,用于统计可哈希对象的频率。它是字典的子类,键是元素,值是元素的计数。Counter最常见的用途是统计元素在可迭代对象(如列表、字符串等)中出现的频率,此外Counter还支持加法、减法、交集和并集等数学运算,可以方便地对多个计数器进行操作。

from collections import Counter# 创建一个计数器
cnt = Counter(['a', 'b', 'c', 'a', 'b', 'a'])# 访问计数
print(cnt['a'])  # 输出: 3
print(cnt['b'])  # 输出: 2
print(cnt['c'])  # 输出: 1# 计数器的其他操作
print(cnt.most_common(2))  # 输出: [('a', 3), ('b', 2)]# 创建另一个计数器
cnt1 = Counter(['a', 'a', 'c', 'a', 's', 'a'])# 合并两个计数器
add_cnts = cnt + cnt1
print(add_cnts) # Counter({'a': 7, 'b': 2, 'c': 2, 's': 1})# 统计两个计数器的差异,在A-B的例子中,统计的是A之于B多出来的元素
minus_cnts = cnt - cnt1
print(minus_cnts) # Counter({'b': 2})
minus_cnts = cnt1 - cnt
print(minus_cnts) # Counter({'a': 1, 's': 1})# 统计两个计数器的交集
print(cnt & cnt1) # Counter({'a': 3, 'c': 1})# 统计两个计数器的并集
print(cnt | cnt1) # Counter({'a': 4, 'b': 2, 'c': 1, 's': 1})

三、OrderedDict

        OrderedDict是一个有序字典,记录了键值对的插入顺序。OrderedDict可以用于实现最近最少使用缓存(LRU,Least Recently Used),通过将最近访问的元素移动到末尾,可以方便地管理缓存的大小和淘汰策略。另外,在需要比较两个字典的顺序和内容是否相同时,OrderedDict也可以提供准确的比较结果。

from collections import OrderedDict# 创建一个有序字典
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3# 访问有序字典
for key, value in od.items():print(key, value)# a 1# b 2# c 3# 比较两个有序字典是否相同
od1 = OrderedDict()
od1['a'] = 1
od1['b'] = 2
od1['c'] = 3
print(od==od1) # True# 移动元素到末尾
od.move_to_end('a', last=True)
print(od) # OrderedDict([('b', 2), ('c', 3), ('a', 1)])
print(od==od1) # False# 移动元素到开头
od.move_to_end('a', last=False)
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])# 删除并返回最后一个键值对
od.popitem()
print(od) # OrderedDict([('a', 1), ('b', 2)])# 删除并返回第一个键值对
od.popitem(last=False)
print(od) # OrderedDict([('b', 2)])

四、defaultdict

        defaultdict是一个带有默认值的字典,如果在括号中指定int则默认值为0,如果是list则默认值是一个空列表,也可以设置为其他数据类型,如果设置为None,则defaultdict与普通的字典一样。defaultdict的特点是当访问一个不存在的键时,会返回默认值,而不是抛出KeyError异常。

from collections import defaultdict# 创建一个带有默认值的字典
dd = defaultdict(int)# 访问不存在的键
print(dd['a'])  # 输出: 0# 设置键值对
dd['b'] = 1
print(dd['b'])  # 输出: 1# 创建一个带有默认值的字典
dd = defaultdict(list)# 访问不存在的键
print(dd['a'])  # 输出: []# 设置键值对
dd['b'] = [1]
print(dd['b'])  # 输出: [1]

五、ChainMap

        ChainMap是一个容器类,用于将多个字典或其他映射对象组合在一起,形成一个单一的视图。它在需要在多个字典中查找值时非常有用

from collections import ChainMap# 创建多个字典
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}# 创建一个ChainMap
cm = ChainMap(dict1, dict2)
print(cm) # ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})# 访问ChainMap
print(cm['a'])  # 输出: 1
print(cm['b'])  # 输出: 2
print(cm['c'])  # 输出: 4

六、namedtuple

        namedtuple是一个工厂函数,用于创建具名元组。具名元组类似于普通的元组,但具名元组的每个元素都有一个名称,可以通过名称来访问元素。在需要定义简单的数据结构时,namedtuple可以作为类的替代方案。与类相比,namedtuple更加简洁,不需要编写初始化方法和其他冗长的代码。另外,namedtuple是不可变的,这意味着一旦创建,就不能修改其内容。

from collections import namedtuple# 定义具名元组类
Person = namedtuple('Person', ['name', 'age', 'gender'])# 创建具名元组实例
person = Person(name='Alice', age=20, gender='Female')# 访问元素
print(person.name)  # 输出: Alice
print(person.age)   # 输出: 20
print(person.gender)  # 输出: Female

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/481289.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言:C语言实现对MySQL数据库表增删改查功能

基础DOME可以用于学习借鉴&#xff1b; 具体代码 #include <stdio.h> #include <mysql.h> // mysql 文件&#xff0c;如果配置ok就可以直接包含这个文件//宏定义 连接MySQL必要参数 #define SERVER "localhost" //或 127.0.0.1 #define USER "roo…

Spark基本命令详解

文章目录 Spark基本命令详解一、引言二、Spark Core 基本命令1、Transformations&#xff08;转换操作&#xff09;1.1、groupBy(func)1.2、filter(func) 2、Actions&#xff08;动作操作&#xff09;2.1、distinct([numTasks])2.2、sortBy(func, [ascending], [numTasks]) 三、…

github webhooks 实现网站自动更新

本文目录 Github Webhooks 介绍Webhooks 工作原理配置与验证应用云服务器通过 Webhook 自动部署网站实现复制私钥编写 webhook 接口Github 仓库配置 webhook以服务的形式运行 app.py Github Webhooks 介绍 Webhooks是GitHub提供的一种通知方式&#xff0c;当GitHub上发生特定事…

蓝桥杯模拟题不知名题目

题目:p是一个质数&#xff0c;但p是n的约数。将p称为是n的质因数。求2024最大质因数。 #include<iostream> #include<algorithm> using namespace std; bool fun(int x) {for(int i 2 ; i * i < x ; i){if(x % i 0)return false;}return true; } int main() …

【从零开始的LeetCode-算法】3264. K 次乘运算后的最终数组 I

给你一个整数数组 nums &#xff0c;一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作&#xff0c;每次操作中&#xff1a; 找到 nums 中的 最小 值 x &#xff0c;如果存在多个最小值&#xff0c;选择最 前面 的一个。将 x 替换为 x * multiplier 。 请你…

Python 爬虫指定数据提取【Xpath】

Xpath 是一个非常好用的解析方法&#xff0c;使用前需要安装对应的库&#xff0c;这个自行搜索&#xff0c;很简单&#xff01; 示例代码 from lxml import etree text <div><ul><li class"item-0"><a href"link1.html">first …

C++设计模式(观察者模式)

一、介绍 1.动机 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系”&#xff0c;即一个对象的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。如果这样的依赖关系过于紧密&#xff0c;将使软件不能很好地抵…

排序算法2

排序算法1-CSDN博客 排序算法1中提及的是较为基础(暴力实现&#xff0c;复杂度较高)的排序算法&#xff0c;不适合于数据量较大的场景&#xff0c;比如序列长度达到1e5 接下来以蓝桥另一道题目来理解其它的排序算法 蓝桥3226 蓝桥账户中心 样例 5 1 5 9 3 7 4、快速排序 快速排…

go结构体匿名“继承“方法冲突时继承优先顺序

在 Go 语言中&#xff0c;匿名字段&#xff08;也称为嵌入字段&#xff09;可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时&#xff0c;嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。 如果多个嵌入结…

Ubuntu Server 22.04.5 从零到一:详尽安装部署指南

文章目录 Ubuntu Server 22.04.5 从零到一&#xff1a;详尽安装部署指南一、部署环境二、安装系统2.1 安装2.1.1 选择安装方式2.1.2 选择语言2.1.3 选择不更新2.1.4 选择键盘标准2.1.5 选择安装版本2.1.6 设置网卡2.1.7 配置代理2.1.8 设置镜像源2.1.9 选择装系统的硬盘2.1.10 …

鸿蒙征文|鸿蒙技术分享:使用到的开发框架和技术概览

目录 每日一句正能量前言正文1. 开发环境搭建关键技术&#xff1a;2. 用户界面开发关键技术&#xff1a;3. 应用逻辑开发关键技术&#xff1a;4. 应用测试关键技术&#xff1a;5. 应用签名和打包关键技术&#xff1a;6. 上架流程关键技术&#xff1a;7. 后续维护和更新关键技术…

C++初阶—C++入门

第一章&#xff1a;C关键字(C98) C 总计 63个关键字&#xff0c;下面只是看一下 C 有多少关键字&#xff0c;不对关键字进行具体的讲解。 第二章&#xff1a;命名空间 #include <stdio.h> #include <stdlib.h>int rand 0;int main() {printf("%d\n", r…

马斯克的 AI 游戏工作室:人工智能与游戏产业的融合新纪元

近日&#xff0c;马斯克在 X 平台&#xff08;前身为 Twitter&#xff09;发文称&#xff0c;“太多游戏工作室被大型企业所拥有&#xff0c;xAI 将启动一个 AI 游戏工作室&#xff0c;让游戏再次变得精彩”。这一言论不仅展示了马斯克对游戏行业现状的不满&#xff0c;也揭示了…

数据库期末复习题库

1. Mysql日志功能有哪些? 记录日常操作和错误信息&#xff0c;以便了解Mysql数据库的运行情况&#xff0c;日常操作&#xff0c;错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份&#xff1a;全部都备份一遍表备份&#xff1a;只提取数据库中的数据&#xff0…

opencv 区域提取三种算法

opencv 区域提取三种算法 1.轮廓查找 findContours()函数&#xff0c;得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…

如何快速上手UPR ---查看资源检测报告

上一章说了如何快速使用资源检测器 那么如何修复我们 的不规范资源呢&#xff1f; 我们都知道一些常规的美术资源优化&#xff0c;但是还是会有一些没有注意到的点 导致我们游戏的性能降低 可以看到我们的Animation 的的不规范 检查动画曲线精度 &#xff0c;其实我觉得他是…

摄影相关常用名词

本文介绍与摄影相关的常用名词。 曝光 Exposure 感光元件接收光线的过程&#xff0c;决定图像的明暗程度和细节表现。 光圈 Aperture 控制镜头进光量的孔径大小&#xff0c;用 F 值&#xff08;f-stop&#xff09; 表示。 光圈越大&#xff08;F 值越小&#xff09;&#xff0c…

NeuIPS 2024 | YOCO的高效解码器-解码器架构

该研究提出了一种新的大模型架构&#xff0c;名为YOCO&#xff08;You Only Cache Once&#xff09;&#xff0c;其目的是解决长序列语言模型推理中的内存瓶颈。YOCO通过解码器-解码器结构的创新设计&#xff0c;显著减少推理时的显存占用并提升了长序列的处理效率。 现有大模…

webrtc视频会议学习(三)

文章目录 关联&#xff1a;源码搭建coturn服务器nginx配置ice配置需服务器要开放的端口 效果 关联&#xff1a; webrtcP2P音视频通话&#xff08;一&#xff09; webrtcP2P音视频通话&#xff08;二&#xff09; webrtc视频会议学习&#xff08;三&#xff09; 源码 WebRTC…

C++ 红黑树 【内含代码】

1. 红黑树 1.1 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储为表示节点的颜色&#xff0c;可以使Red或Black。通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&…