Python编程:集合工具类之Deque及UserString和UserList
xsobi 2025-04-08 20:15 18 浏览
前言
本文继续来盘Python内置集合模块,本期介绍其中的工具类双端队列类(Deque)、用户列表类(UserList)和UserString类的使用。我们还是采用“短平快”的模式——文字+代码,助你多“快好省地学会它,并能都收用上它。
闲话少叙,开始正文——记得“ 点赞 + 关注@传新视界 ” 啊~ ^_^
1. Deque
Deque是栈和队列的泛化(名字读作“deck”,是“双端队列”的缩写)。deque支持线程安全、内存高效的从deque的任意一侧添加和弹出操作,且在任何一个方向上都具有大致相同的O(1)性能。
尽管列表对象支持类似的操作,但它们都针对快速定长操作进行了优化,并为pop(0)和insert(0, v)操作带来O(n)内存移动成本,这两种操作会改变底层数据表示的大小和位置。
导入Python集合模块后,通过collections.deque([iterable[, maxlen]]),这会返回一个新的deque对象,用iterable的数据从左到右初始化(使用append())。如果未指定iterable,则新的deque为空。
可选参数maxlen,为deque的最大大小,如果未绑定则为None。如果未指定maxlen或为None,则deques可以增长到任意长度。否则,deque将被限定为指定的最大长度。
需要注意的是,一旦指定边界长度的deque已满,当添加新项时,相应数量的项将从另一端丢弃。看下面的简单示例:
### Deque
from collections import deque
# 声明一个deque对象,用可迭代对象初始化
q = deque(['user', 'password', 'token'])
print(q)
程序输出结果如下:
deque(['user', 'password', 'token']) |
上面的清单中,通过传递一个列表作为参数来定义一个deque对象。现在再创建另一个,但这次使用的是字符串:
# 基于字符串创建含有3项的新deque对象
d = deque('dqi')
# 迭代遍历deque元素
for elem in d:
print(elem.upper())
运行程序的输出结果如下:
D Q I |
现在来看看deque对象的内容:
# deque的内容列表
deque_contents = list(d)
print(deque_contents)
# 查看下最左边项
print(d[0])
# 查看下最右边项
print(d[-1])
运行程序的结果输出为:
['d', 'q', 'i'] d i |
接下来,简要看看deque对象支持的一些方法:
1)append(x):
将x添加到deque的右侧。
2)appendleft(x):
在deque的左边加上x。
示例如下:
# 在右边添加新项
d.append('j')
# 在左边添加新项
d.appendleft('f')
# 展示deque构成表现
print(d)
输出结果为:
deque(['f', 'd', 'q', 'i', 'j']) |
3)pop():
从deque的右侧删除并返回一个元素。如果没有元素,则引发IndexError。
4)popleft():
从deque的左侧删除并返回一个元素。如果没有元素,则引发IndexError。
# 从右侧删除项并返回对应项
rightmost = d.pop()
print(rightmost)
# 从左侧删除项并返回对应项
leftmost = d.popleft()
print(leftmost)
输出结果如下:
j f |
5)clear():
从deque中删除所有元素,使其长度为0。
6)copy():
创建deque的浅拷贝。
7)count(x):
计算等于x的deque元素的个数。
8)extend(iterable):
在deque的右侧通过追加iterable参数中的元素来扩展当前对象。
# 一次增加多个元素
d.extend('jkl')
print(d)
输出结果如下:
deque(['d', 'q', 'i', 'j', 'k', 'l']) |
9)extendleft(iterable):
在deque对象的左侧通过iterable中元素来追加来扩展当前对象。
注意,左追加的序列导致iterable参数中元素的顺序颠倒。如下所示:
# extendleft() 反转输入顺序
d.extendleft('xyz')
print(d)
输出结果为:
deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l']) |
10)index(x[,start[,stop]]):
返回x在deque中的位置(在索引start或之后和索引stop之前)。返回第一个匹配项,如果未找到则引发ValueError异常。
11)insert(i ,x):
将x插入到deque中i的位置。如果插入会导致有界deque增长超过maxlen,则抛出IndexError异常。
12)remove(value):
删除第一个出现的值。如果没有找到,则抛出ValueError。
13)rotate(n = 1):
向右轮转deque n步。如果n是负数,向左旋转,即把n个元素到左边或右边。
示例如下:
# 开始时deque
print(d)
#向右轮转
d.rotate(1)
print(d)
# 向左轮转
d.rotate(-1)
print(d)
d.rotate(3)
print(d)
输出结果为:
deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l']) deque(['l', 'z', 'y', 'x', 'd', 'q', 'i', 'j', 'k']) deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l']) deque(['j', 'k', 'l', 'z', 'y', 'x', 'd', 'q', 'i']) |
14)reverse()
将deque的元素原地反转,然后返回None。
# 开始是deque
print('old deque:', d)
# 反转deque中元素
new_deq = d.reverse()
print('new deque:', new_deq)
# 反转后原始deque
print('old deque:', d)
输出结果:
old deque: deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l']) new deque: None old deque: deque(['l', 'k', 'j', 'i', 'q', 'd', 'x', 'y', 'z']) |
正如输出结果所示,reverse()方法将deque的元素就地反转,这意味着我们的原始deque对象被修改了。它返回None。
提醒:由于Deque是线程安全,常用在多线程环境下使用,比如对象共享池、数据库连接池等方法,还可以便利控制或说自定义队列中的对象上限。
2. UserList
UserList类用于充当列表对象的包装器。对于你自己的创建类似列表类来说,它是一个有用的基类,可以继承并覆盖其现有的方法或添加新的方法。通过这种方式,可以向Python中的列表添加新的行为。
对这个类的需求已经部分被直接来自list的子类能力所取代;但是,这个类更容易使用,因为底层列表可以作为属性访问。其通常使用方式为:
import collections
ulist = collections.UserList([list])
该类模拟列表行为,其实例的内容保存在一个常规列表中,可以通过UserList实例的data属性访问该列表。实例的内容最初化为list的副本,默认为空列表[]。参数list可以是任何可迭代对象,例如一个真正的Python列表或UserList对象。
除了支持可变序列的方法和操作外,UserList实例还提供了以下属性:
data:
一个用于存储UserList类内容的真实列表对象。
假设我们想要定义一个不允许删除其中项的列表。我们可以通过继承UserList轻松定义这样的类:
from collections import UserList
# 自定义一个类,其继承自UserList
# 该类不允许删除其所含项
# Python中的List类的删除方法:
# remove() and pop()
class ListWithNoItemDelete(UserList):
# 覆写remove()方法
def remove(self, s=None):
self.not_allowed()
# 覆写 pop() 方法
def pop(self, s=None):
self.not_allowed()
# 定义一个不允许方法
def not_allowed(self):
raise RuntimeError("Deletion not allowed")
# 自定义列表对象
custom_list = ListWithNoItemDelete(['a', 'b', 'c'])
# 试图删除列表项操作
custom_list.remove('b')
运行上述程序控制台输出类似如下内容:
…… raise RuntimeError("Deletion not allowed") RuntimeError: Deletion not allowed |
使用建议:该类型主要特点是参数的副本化,即不会改变传进来的列表,同时多了个存储属性data,实际应用中可酌情使用。
3. UserString
UserString类充当字符串对象的包装器。对该类的需求已经部分被直接从str派生子类的能力所取代;但是,这个类更容易使用,因为底层字符串可以作为属性访问。其通常使用形式:
import collections
userStr = collections.UserString(seq)
该类模拟字符串对象,其实例的内容保存在一个常规字符串对象中,其可通过UserString实例的data属性访问该对象。实例的内容最初化为seq的一个副本。seq参数可以是任何可以使用内置str()函数转换为字符串的对象。
除了支持字符串的方法和操作,UserString实例提供以下属性:
data:
这是个str对象,用于存储UserString类的内容。
假设我们想要定义一个自己的str类,包含concatenate()方法,可以参考如下实现:
# UserString from collections import UserString # 定义一个继承自UserString的子类 class CustomStrClass(UserString): # 定义一个新方法 def concatenate(self, other=None, delimiter=' '): self.data += delimiter + other # 创建自定义字符串对象 custom_str = CustomStrClass('My Custom') custom_str.concatenate('String Class') print(custom_str) |
运行程序,输出结果类似如下:
My Custom String Class |
概括:该字符串最大特色就是存储的是参数副本,并具有可自行定制处理的机制以及data属性。通常状况下,str类即可。
4.本文小结
本期中主要介绍Python集合模块中的双端队列(Deque)、用户列表(UserList)以及用户字符串(UserString),使用中要根据需要来结合他们各自的特点使用,比如deque的线程安全的支持和双端操作、UserString与UserString的副本化及data存储属性等。
本期就写这些了,点个赞,关注一下@传新视界,分享给更多爱好者吧。再见~
相关推荐
- 大模型技术:详解LangGraph,从基础到高级
-
图片来自DALL-E3LangChain是构建由Lardge语言模型提供支持的应用程序的领先框架之一。借助LangChain表达语言(LCEL),定义和执行分步操作序列(也称为链)变得更加简...
- SQL知识大全三):SQL中的字符串处理和条件查询
-
点击上方蓝字关注我们今天是SQL系列的第三讲,我们会讲解条件查询,文本处理,百分比,行数限制,格式化以及子查询。条件查询IF条件查询#if的语法IF(expr1,expr2,expr3)#示例S...
- 聊聊Spring AI Alibaba的PdfTablesParser
-
序本文主要研究一下SpringAIAlibaba的PdfTablesParserPdfTablesParsercommunity/document-parsers/spring-ai-alibab...
- SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移?
-
Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(ro...
- MySQL合集-单机容器化
-
MySQL单机容器化mkdir-p/opt/mysql/{data,etc}cpmy.cnf/opt/mysql/etc#dockersearchmysqldockerpullm...
- 差异基因分析不会做?最简单的火山图做法,一秒学会
-
最近很多刚了解生信的同学问喵学姐:看了一些文献,文献里的各种图怎么看呀,完全看不懂。今天喵学姐就来给大家讲一讲我们平时做的最基础的差异分析——火山图火山图(Volcanoplot)是散点图的一种,它...
- 每分钟写入6亿条数据,携程监控系统Dashboard存储升级实践
-
一、背景概述框架Dashboard是一款携程内部历史悠久的自研监控产品,其定位是企业级Metrics监控场景,主要提供用户自定义Metrics接入,并基于此提供实时数据分析和视图展现的面板服务,提供...
- 高效开发库:C++ POCO库开发者使用指南
-
目录POCO库简介POCO库的特点POCO库的模块分类POCO库的应用场景各模块功能详解与代码示例1.POCO库简介POCO(PortableComponents)是一个开源的C++类库,旨在为开...
- Oracle中JDBC处理PreparedStatement处理Char问题浅析
-
最近碰到一个奇怪的问题,同样的Java代码,在不同的数据库执行,结果集却不同?代码片段如下:表的定义:SAMPLE_TABLE(IDINTEGER,NAMECH...
- mp4封装格式各box类型讲解及IBP帧计算
-
mp4封装格式各box类型讲解及IBP帧计算目录;总结送学习大纲零基础到实战boxftypboxmoovboxmvhdbox(MovieHeaderBox)trakbox(Track...
- 「猪译馆」ASFV在不同基质中的存活时间(一)
-
作者Author欧洲食品安全署EuropeanFoodSafetyAuthority(EFSA),AndreaGervelmeyer欧盟委员会委托欧洲食品安全署对非洲猪瘟病毒在不同基质中...
- 视频封装格式:MP4格式详解
-
1.MP4格式概述1.1简介MP4或称MPEG-4第14部分(MPEG-4Part14)是一种标准的数字多媒体容器格式。扩展名为.mp4。虽然被官方标准定义的唯一扩展名是.mp4,但第三方通...
- 音视频八股文(10)-- mp4结构
-
介绍mp4文件格式又被称为MPEG-4Part14,出自MPEG-4标准第14部分。它是一种多媒体格式容器,广泛用于包装视频和音频数据流、海报、字幕和元数据等。(顺便一提,目前流行的视频编码格式...
- 大数据ClickHouse进阶(九):ClickHouse的From和Sample子句
-
#头条创作挑战赛#ClickHouse的From和Sample子句一、From子句From子句表示从何处读取数据,支持2种形式,由于From比较简单,这里不再举例,2种使用方式如下:SELECTcl...
- 一文读懂MP4封装格式
-
简介MP4或称MPEG-4第14部分(MPEG-4Part14)是一种标准的数字多媒体容器格式。扩展名为.mp4。虽然被官方标准定义的唯一扩展名是.mp4,但第三方通常会使用各种扩展名来指示文件的...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)