python内置模块collections引见
collections是Python内建的一个荟萃模块,提供了许多有用的荟萃类。
一、namedtuple
python提供了不少十分好用的根本类型,比方不成变类型tuple,咱们能够轻松地用它来示意一个二元向量。
保举学习:Python视频教程
>>> v = (2,3)
咱们发现,尽管(2,3)示意出了一个向量的两个坐标,然而,假如不额定阐明,又很难间接看出这个元组是用来示意一个坐标的。
为此界说一个class又小题年夜做了,这时候,namedtuple就派上用场了。
>>> from collections import namedtuple >>> Vector = namedtuple('Vector', ['x', 'y']) >>> v = Vector(2,3) >>> v.x 2 >>> v.y 3
namedtuple是一个函数,它用来创立一个自界说的tuple工具,而且规则了tuple元素的个数,并能够用属性而没有是索引来援用tuple的某个元素。
这样一来,咱们用namedtuple能够很不便地界说一种数据类型,它具有tuple的没有变性,又能够依据属性来援用,应用非常不便。
咱们能够验证创立的Vector工具的类型。
>>> type(v) <class '__main__.Vector'> >>> isinstance(v, Vector) True >>> isinstance(v, tuple) True
相似的,假如要用坐标以及半径示意一个圆,也能够用namedtuple界说:
>>> Circle = namedtuple('Circle', ['x', 'y', 'r']) # namedtuple('称号', [‘属性列表’])
二、deque
正在数据构造中,咱们晓得行列步队以及货仓旅馆是两个十分首要的数据类型,一个进步前辈先出,一个落后先出。正在python中,应用list存储数据时,按索引拜访元素很快,然而拔出以及删除了元素就很慢了,由于list是线性存储,数据量年夜的时分,拔出以及删除了效率很低。
deque是为了高效完成拔出以及删除了操作的双向链表构造,十分适宜完成行列步队以及货仓旅馆这样的数据构造。
>>> from collections import deque >>> deq = deque([1, 2, 3]) >>> deq.append(4) >>> deq deque([1, 2, 3, 4]) >>> deq.appendleft(5) >>> deq deque([5, 1, 2, 3, 4]) >>> deq.pop() 4 >>> deq.popleft() 5 >>> deq deque([1, 2, 3])
deque除了了完成list的append()以及pop()外,还支持appendleft()以及popleft(),这样就能够十分高效地往头部增加或删除了元素。
三、defaultdict
应用dict字典类型时,假如援用的key没有存正在,就会抛出KeyError。假如心愿Key没有存正在时,前往一个默许值,就能够用defaultdict。
>>> from collections import defaultdict >>> dd = defaultdict(lambda: 'defaultvalue') >>> dd['key1'] = 'a' >>> dd['key1'] 'a' >>> dd['key2'] # key2不决义,前往默许值 'defaultvalue'
留意默许值是挪用函数前往的,而函数正在创立defaultdict工具时传入。
除了了正在Key没有存正在时前往默许值,defaultdict的其余行为跟dict是齐全同样的。
四、OrderedDict
应用dict时,key是无序的。正在对dict做迭代时,咱们无奈确定key的程序。
然而假如想要放弃key的程序,能够用OrderedDict。
>>> from collections import OrderedDict >>> 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)])
留意,OrderedDict的key会依照拔出的程序陈列,没有是key自身排序
>>> od = OrderedDict() >>> od['z'] = 1 >>> od['y'] = 2 >>> od['x'] = 3 >>> list(od.keys()) # 依照拔出的Key的程序前往 ['z', 'y', 'x']
OrderedDict能够完成一个FIFO(进步前辈先出)的dict,当容量凌驾限度时,先删除了最先增加的key。
from collections import OrderedDict class LastUpdatedOrderedDict(OrderedDict): def __init__(self, capacity): super(LastUpdatedOrderedDict, self).__init__() self._capacity = capacity def __setitem__(self, key, value): containsKey = 1 if key in self else 0 if len(self) - containsKey >= self._capacity: last = self.popitem(last=False) print('remove:', last) if containsKey: del self[key] print('set:', (key, value)) else: print('add:', (key, value)) OrderedDict.__setitem__(self, key, value)
五、ChainMap
ChainMap能够把一组dict串起来并组成一个逻辑上的dict。ChainMap自身也是一个dict,然而查找的时分,会依照程序正在外部的dict顺次查找。
何时应用ChainMap最合适?举个例子:使用顺序往往都需求传入参数,参数能够经过饬令行传入,能够经过环境变量传入,还能够有默许参数。咱们能够用ChainMap完成参数的优先级查找,即先查饬令行参数,假如不传入,再查环境变量,假如不,就应用默许参数。
上面的代码演示了若何查找user以及color这两个参数。
from collections import ChainMap import os, argparse # 结构缺省参数: defaults = { 'color': 'red', 'user': 'guest' } # 结构饬令行参数: parser = argparse.ArgumentParser() parser.add_argument('-u', '--user') parser.add_argument('-c', '--color') namespace = parser.parse_args() co妹妹and_line_args = { k: v for k, v in vars(namespace).items() if v } # 组分解ChainMap: combined = ChainMap(co妹妹and_line_args, os.environ, defaults) # 打印参数: print('color=%s' % combined['color']) print('user=%s' % combined['user'])
不任何参数时,打印出默许参数:
$ python3 use_chainmap.py color=red user=guest
当传入饬令行参数时,优先应用饬令行参数:
$ python3 use_chainmap.py -u bob color=red user=bob
同时传入饬令行参数以及环境变量,饬令行参数的优先级较高:
$ user=admin color=green python3 use_chainmap.py -u bob color=green user=bob
六、Counter
Counter是一个简略的计数器,例如,统计字符呈现的个数:
from collections import Counter >>> s = 'abbcccdddd' >>> Counter(s) Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})
Counter实际上也是dict的一个子类。
七、小结
collections模块提供了一些有用的荟萃类,能够依据需求选用。
以上就是python内置模块collections引见的具体内容,更多请存眷资源魔其它相干文章!
标签: 模块 Python python教程 python编程 python使用问题 collections
抱歉,评论功能暂时关闭!