类别:Python / 日期:2019-12-02 / 浏览:109 / 评论:0

python内置模块collections引见

collections是Python内建的一个鸠合模块,供应了许多有效的鸠合类。

1、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('称号', [‘属性列表’])

2、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(),如许就能够异常高效地往头部增加或删除元素。

3、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是完整一样的。

4、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)

5、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()
command_line_args = { k: v for k, v in vars(namespace).items() if v }
# 组合成ChainMap:
combined = ChainMap(command_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

6、Counter

Counter是一个简朴的计数器,比方,统计字符涌现的个数:

from collections import Counter
>>> s = 'abbcccdddd'
>>> Counter(s)
Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})

Counter实际上也是dict的一个子类。

7、小结

collections模块供应了一些有效的鸠合类,能够依据须要选用。

以上就是python内置模块collections引见的细致内容,更多请关注ki4网别的相干文章!

打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。