怎么在python中使用collections模块
怎么在python中使用collections模块?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
什么是模块?
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到python解释器的内置模块
为何要使用模块?
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,
常用模块
1. collections模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple2.deque: 双端队列,可以快速的从另外一侧追加和推出对象3.Counter: 计数器,主要用来计数4.OrderedDict: 有序字典5.defaultdict: 带有默认值的字典
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p=(1,2)
但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
这时,namedtuple就派上了用场:
用法:namedtuple('名称', [属性list]):
>>>fromcollectionsimportnamedtuple
>>>Point=namedtuple('Point',['x','y'])
>>>p=Point(1,2)
>>>p.x
1
>>>p.y
2类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:
fromcollectionsimportnamedtuple
Cirle=namedtuple("Cirle",['x','y','z'])
c=Cirle(4,5,6)
print(c.x,c.y,c.z)
OutPut:
4562. deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
>>>fromcollectionsimportdeque
>>>q=deque(['a','b','c'])
>>>q.append('x')
>>>q.appendleft('y')
>>>q
deque(['y','a','b','c','x'])deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
fromcollectionsimportdeque
dq=deque([1,2])
dq.append('a')#从后面放数据[1,2,'a']
dq.appendleft('b')#从前面放数据['b',1,2,'a']
dq.insert(2,3)#['b',1,3,2,'a']
print(dq.pop())#从后面取数据
print(dq.pop())#从后面取数据
print(dq.popleft())#从前面取数据
print(dq)
Output:
a
2
b
deque([1,3])3. OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
>>>fromcollectionsimportOrderedDict
>>>d=dict([('a',1),('b',2),('c',3)])
>>>d#dict的Key是无序的
{'a':1,'c':3,'b':2}
>>>od=OrderedDict([('a',1),('b',2),('c',3)])
>>>od#OrderedDict的Key是有序的
OrderedDict([('a',1),('b',2),('c',3)])
#有序字典
fromcollectionsimportOrderedDict
od=OrderedDict([('a',1),('b',2),('c',3)])
print(od)#OrderedDict的Key是有序的
print(od['a'])
forkinod:
print(k)
OutPut:
OrderedDict([('a',1),('b',2),('c',3)])
1
a
b
c注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序
4. defaultdict
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
>>>fromcollectionsimportdefaultdict >>>dd=defaultdict(lambda:'N/A') >>>dd['key1']='abc' >>>dd['key1']#key1存在 'abc' >>>dd['key2']#key2不存在,返回默认值 'N/A'
5. Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
c=Counter('abcdeabcdabcaba')
printc
输出:Counter({'a':5,'b':4,'c':3,'d':2,'e':1})创建
下面的代码说明了Counter类创建的四种方法:
Counter类的创建 :
>>>c=Counter()#创建一个空的Counter类
>>>c=Counter('gallahad')#从一个可iterable对象(list、tuple、dict、字符串等)创建
>>>c=Counter({'a':4,'b':2})#从一个字典对象创建
>>>c=Counter(a=4,b=2)#从一组键值对创建计数值的访问与缺失的键
当所访问的键不存在时,返回0,而不是KeyError;否则返回它的计数。
计数值的访问
>>>c=Counter("abcdefgab")
>>>c["a"]
2
>>>c["c"]
1
>>>c["h"]
0计数器的更新(update和subtract)
可以使用一个iterable对象或者另一个Counter对象来更新键值。
计数器的更新包括增加和减少两种。其中,增加使用update()方法:
计数器的更新(update)
>>>c=Counter('which')
>>>c.update('witch')#使用另一个iterable对象更新
>>>c['h']
3
>>>d=Counter('watch')
>>>c.update(d)#使用另一个Counter对象更新
>>>c['h']
4减少则使用subtract()方法:
计数器的更新(subtract)
>>>c=Counter('which')
>>>c.subtract('witch')#使用另一个iterable对象更新
>>>c['h']
1
>>>d=Counter('watch')
>>>c.subtract(d)#使用另一个Counter对象更新
>>>c['a']
-1键的修改和删除
当计数值为0时,并不意味着元素被删除,删除元素应当使用del。
>>>c=Counter("abcdcba")
>>>c
Counter({'a':2,'c':2,'b':2,'d':1})
>>>c["b"]=0
>>>c
Counter({'a':2,'c':2,'d':1,'b':0})
>>>delc["a"]
>>>c
Counter({'c':2,'b':2,'d':1})elements()
返回一个迭代器。元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含。
elements()方法
>>>c=Counter(a=4,b=2,c=0,d=-2) >>>list(c.elements()) ['a','a','a','a','b','b']
most_common([n])
返回一个TopN列表。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,排列是无确定顺序的。most_common()方法
>>>c=Counter('abracadabra')
>>>c.most_common()
[('a',5),('r',2),('b',2),('c',1),('d',1)]
>>>c.most_common(3)
[('a',5),('r',2),('b',2)]浅拷贝copy
>>>c=Counter("abcdcba")
>>>c
Counter({'a':2,'c':2,'b':2,'d':1})
>>>d=c.copy()
>>>d
Counter({'a':2,'c':2,'b':2,'d':1})算术和集合操作
+、-、&、|操作也可以用于Counter。其中&和|操作分别返回两个Counter对象各元素的最小值和最大值。需要注意的是,得到的Counter对象将删除小于1的元素。
Counter对象的算术和集合操作
>>>c=Counter(a=3,b=1)
>>>d=Counter(a=1,b=2)
>>>c+d#c[x]+d[x]
Counter({'a':4,'b':3})
>>>c-d#subtract(只保留正数计数的元素)
Counter({'a':2})
>>>c&d#交集:min(c[x],d[x])
Counter({'a':1,'b':1})
>>>c|d#并集:max(c[x],d[x])
Counter({'a':3,'b':2})其他常用操作
下面是一些Counter类的常用操作,来源于Python官方文档
Counter类常用操作
sum(c.values())#所有计数的总数 c.clear()#重置Counter对象,注意不是删除 list(c)#将c中的键转为列表 set(c)#将c中的键转为set dict(c)#将c中的键值对转为字典 c.items()#转为(elem,cnt)格式的列表 Counter(dict(list_of_pairs))#从(elem,cnt)格式的列表转换为Counter类对象 c.most_common()[:-n:-1]#取出计数最少的n个元素 c+=Counter()#移除0和负值
看完上述内容,你们掌握怎么在python中使用collections模块的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注恰卡编程网行业资讯频道,感谢各位的阅读!
推荐阅读
-
一文教你Python如何快速精准抓取网页数据
本文将使用requests和beautifulsoup这两个流行的库来实现。1.准备工作首先安装必要的库:pipinst...
-
使用Python实现IP地址和端口状态检测与监控
-
基于Python打造一个智能单词管理神器
-
Python实现微信自动锁定工具
-
使用Python创建一个功能完整的Windows风格计算器程序
python实现windows系统计算器程序(含高级功能)下面我将介绍如何使用python创建一个功能完整的windows风格计...
-
Python开发文字版随机事件游戏的项目实例
随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型。在这类游戏中,玩家必须应对随机发生的情况,这些情况可能会影响他们的资...
-
使用Pandas实现Excel中的数据透视表的项目实践
引言在数据分析中,数据透视表是一种非常强大的工具,它可以帮助我们快速汇总、分析和可视化大量数据。虽然excel提供了内置的数据透...
-
Pandas利用主表更新子表指定列小技巧
一、前言工作的小技巧,利用pandas读取主表和子表,利用主表的指定列,更新子表的指定列。案例:主表:uidname0...
-
Pandas中统计汇总可视化函数plot()的使用
-
Python中tensorflow的argmax()函数的使用小结
在tensorflow中,argmax()函数是一个非常重要的操作,它用于返回给定张量(tensor)沿指定轴的最大值的索引。这个...
