python内置模块collections介绍-Python教程

资源魔 33 0

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

抱歉,评论功能暂时关闭!