Python中的collections模块

举报
努力变强的小C 发表于 2022/09/18 14:58:15 2022/09/18
858 0 0
【摘要】 Python中的collections模块

目录

为什么要有内置模块

collections模块的作用

namedtuple方法

deque(双端队列)方法

为什么要有内置模块

Python的内置模块集合有几个关键数据结构,开发人员在使用时可以直接调用这些结构,而无需自己重复制作轮子。这可以提高开发效率。

collections模块的作用

我们通常用于deque双端队列的python内置列表类的append、extend和pop方法从列表的末尾执行(默认情况下,pop()弹出最后一个元素)。使用时,列表类似于堆栈结构(LIFO)。不同之处在于,列表更灵活,并且具有基于堆栈的动态插入方法。 

collections模块实现的方法

一、namedtuple方法

我们知道数学上有坐标一说,比如a点在原点我们就可以用以下方法来表示a的坐标

a = (0,0)

可是放在Python当中我们一眼看来a = (0,0)只是代表一个含有两个元素的元祖而已,那么我们如何将a改变一下是我们一眼就可以知道该表达式表示坐标

按如下方法即可以实现

from collections import namedtuple
#表示二维坐标
Point = namedtuple('point',['x','y'])
a = Point(0,0)
#从二维坐标中取x轴的数值
print(a.x)
print(a.y)

现在我们不仅可以一眼看出它是个坐标,并且可以像调用类的属性一样获取到a坐标的x和y轴上的坐标值,这样一来就会更加方便了。

但是光用这个方法来表示坐标岂不是很没有意思,那我们来用该方法定义一块饼干

from collections import namedtuple

Cookie = namedtuple('cake',['color','size','tasty'])

cooe = Cookie('red',1.2,'salt')

print(cooe.color)
print(cooe.size)
print(cooe.tasty)

输出结果

red
1.2
salt

这样我们就可以直接调用.的方法来得到饼干的相关属性了,这样就变得十分方便了

二、defaultdict方法

defaultdict类:
Defaultdict是Python内置dict类的一个子类。第一个参数是default_factory属性提供初始值,默认值为None。它重写一个方法并添加一个可写实例变量。它的其他功能与dict相同,但它为不存在的键提供了默认值,以避免KeyError异常。

如果题目有以下要求

将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中

如果按平常的写法的话是难以写出的,这时我们就可以使用如下方法

rom collections import defaultdict

values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = defaultdict(list)

for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)

print(my_dict)

deque(双端队列)方法

双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。

双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。
操作:Deque() 创建一个空的双端队列 | append()向双端队列后面放数据 | appendleft()向双端队列前面放数据 | pop()向双端队列后面取数据 | popleft()向双端队列前面取数据| add_front(item) 从队头加入一个item元素 | add_rear(item)从队尾加入一个item元素
 | remove_front() 从队头删除一个item元素 | remove_rear()从队尾删除一个item元素
 | is_empty() 判断双端队列是否为空 | size() 返回队列的大小

栗子:
 

from collections import deque
dq = deque([1,2])

#向这个队列后端插入‘a’
dq.append('a')
#向这个队列前端插入‘b’
dq.appendleft('b')
#双印这个双端队列
print('插入数据后的队列',dq)

#向第二个位置插入数字3
dq.insert(2,3)
#取数据
print(dq.pop())
print(dq.pop())
print(dq.popleft())
#双印这个双端队列
print('取出数据后的队列',dq)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。