程序员

python标准模块简介(六)collections模块二

2018-04-16  本文已影响0人  躺好别动

这是介绍collections模块的第二部分内容。

1 deque

1.1 简介

deque是双端列表类,实现了对数据高效的插入和删除,我们都知道python中的list查找数据是非常快的,可是插入和删除数据是很慢的。deque提供了popleft,appendleft实现了高效的往头部插入和删除元素。

传入deque一个可迭代对象,得到一个双端列表

In [10]: q = deque()

In [11]: q = deque('1234')

In [12]: q
Out[12]: deque(['1', '2', '3', '4'])

相比于list原有的pop和append外增加了popleft,appendleft。实现了队列头部高效存储删除元素,使用list.insert(0,args),list.pop(0)时间复杂度是O(n)随数据量增加,耗时也相应增加,而deque.popleft 和deque.appendleft时间复杂度是O(1)

In [12]: q
Out[12]: deque(['1', '2', '3', '4'])

In [13]: q.append(5)

In [14]: q
Out[14]: deque(['1', '2', '3', '4', 5])

In [15]: q.pop()
Out[15]: 5

In [16]: q
Out[16]: deque(['1', '2', '3', '4'])

In [17]: q.popleft()
Out[17]: '1'

In [18]: q
Out[18]: deque(['2', '3', '4'])

In [19]: q.appendleft('a')

In [20]: q
Out[20]: deque(['a', '2', '3', '4'])


In [25]: q.extend('qwe')

In [26]: q
Out[26]: deque(['a', '2', '3', '4', 'q', 'w', 'e'])

In [27]: q.extendleft('qwe')

In [28]: q
Out[28]: deque(['e', 'w', 'q', 'a', '2', '3', '4', 'q', 'w', 'e'])

2 Counter

2.1 简介

Counter是一个相当实用的计数器类,是dict的子类,可以方便的利用Counter来进行简单的计数分析。

2.2 构建方式

可以传入可迭代对象,字典,关键字参数来构建Counter

In [31]: s = 'aaaaadddddssssssswwwwwwwwdddddddssklsjgre;gwfhwehfiusafha'

In [32]: c = Counter(s)

In [33]: c
Out[33]:
Counter({';': 1,
         'a': 7,
         'd': 12,
         'e': 2,
         'f': 3,
         'g': 2,
         'h': 3,
         'i': 1,
         'j': 1,
         'k': 1,
         'l': 1,
         'r': 1,
         's': 11,
         'u': 1,
         'w': 10})

In [35]: c1
Out[35]: Counter()

In [36]: c2 = Counter({"a":"1","b":"2"})

In [37]: c2
Out[37]: Counter({'a': '1', 'b': '2'})

In [38]: c3 = Counter(a=1,b=2,c=3)

In [39]: c3
Out[39]: Counter({'a': 1, 'b': 2, 'c': 3})

2.2实用方法

Counter得到的对象是以键值对的方式来组织,键是元素,值是元素出现的数量,可以查看具体元素的数量,没有的元素是0

In [40]: c['a']
Out[40]: 7

In [41]: c[1]
Out[41]: 0

In [42]: c['d']
Out[42]: 12

查询出现频次较高的元素

In [66]: c.most_common()
Out[66]:
[('d', 12),
 ('s', 11),
 ('w', 10),
 ('a', 7),
 ('h', 3),
 ('f', 3),
 ('g', 2),
 ('e', 2),
 ('k', 1),
 ('r', 1),
 ('l', 1),
 ('i', 1),
 ('j', 1),
 ('u', 1),
 (';', 1)]

In [67]: c.most_common(5)
Out[67]: [('d', 12), ('s', 11), ('w', 10), ('a', 7), ('h', 3)]

3 ChainMap

3.1 简介

ChainMap是python3的新特性,它用来将多个map组成一个新的单元(原来的map结构仍然存在,类似于这些map被存在了一个list之中),这比新建一个map再将其他map用update加进来快得多。通过ChainMap可以来模拟嵌套的情景,而且多用于模板之中。

In [76]: m1 = dict(name='chao')

In [77]: m2 = dict(age=23,hobby='python')

In [78]: m = ChainMap(m1,m2)

In [79]: m
Out[79]: ChainMap({'name': 'chao'}, {'age': 23, 'hobby': 'python'})

获取map中的元素

In [80]: m.get('name')
Out[80]: 'chao'

In [81]: m['age']
Out[81]: 23

新增,返回一个新的ChainMap对象

In [85]: m.new_child(m3)
Out[85]: ChainMap({'data': '1-6'}, {'name': 'chao'}, {'age': 23, 'hobby': 'python'})

ChainMap.parents ChainMap.maps

In [86]: m.parents
Out[86]: ChainMap({'age': 23, 'hobby': 'python'})

In [87]: m.maps
Out[87]: [{'name': 'chao'}, {'age': 23, 'hobby': 'python'}]

上一篇 下一篇

猜你喜欢

热点阅读