Python中collections模块
目錄
- Python中collections模塊:模塊實(shí)現(xiàn)了特定目標(biāo)的容器,以提供Python標(biāo)準(zhǔn)內(nèi)建容器 dict、list、set、tuple 的替代選擇。
- Counter:字典的子類,提供了可哈希對(duì)象的計(jì)數(shù)功能
- defaultdict:字典的子類,提供了一個(gè)工廠函數(shù),為字典查詢提供了默認(rèn)值
- OrderedDict:字典的子類,保留了他們被添加的順序
- namedtuple:創(chuàng)建命名元組子類的工廠函數(shù)
- deque:類似列表容器,實(shí)現(xiàn)了在兩端快速添加(append)和彈出(pop)
- ChainMap:類似字典的容器類,將多個(gè)映射集合到一個(gè)視圖里面
Counter
Counter是一個(gè)dict子類,主要是用來對(duì)你訪問的對(duì)象的頻率進(jìn)行計(jì)數(shù)。
常用方法:
- elements():返回一個(gè)迭代器,每個(gè)元素重復(fù)計(jì)算的個(gè)數(shù),如果一個(gè)元素的計(jì)數(shù)小于1,就會(huì)被忽略。
- most_common([n]):返回一個(gè)列表,提供n個(gè)訪問頻率最高的元素和計(jì)數(shù)
- subtract([iterable-or-mapping]):從迭代對(duì)象中減去元素,輸入輸出可以是0或者負(fù)數(shù)
- update([iterable-or-mapping]):從迭代對(duì)象計(jì)數(shù)元素或者從另一個(gè) 映射對(duì)象 (或計(jì)數(shù)器) 添加。
常用的方法:
>>> c = collections.Counter('hello world hello world hello nihao'.split()) >>> c Counter({'hello': 3, 'world': 2, 'nihao': 1}) # 獲取指定對(duì)象的訪問次數(shù),也可以使用get()方法 >>> c['hello'] 3# 查看元素 >>> list(c.elements()) ['hello', 'hello', 'hello', 'world', 'world', 'nihao']# 追加對(duì)象,或者使用c.update(d) >>> d = collections.Counter('hello world'.split()) >>> c + d Counter({'hello': 4, 'world': 3, 'nihao': 1})# 減少對(duì)象,或者使用c.subtract(d) >>> c - d Counter({'hello': 2, 'world': 1, 'nihao': 1})# 清除 >>> c.clear() >>> c Counter()defaultdict
collections.defaultdict(default_factory)為字典的沒有的key提供一個(gè)默認(rèn)的值。參數(shù)應(yīng)該是一個(gè)函數(shù),當(dāng)沒有參數(shù)調(diào)用時(shí)返回默認(rèn)值。如果沒有傳遞任何內(nèi)容,則默認(rèn)為None。
>>> d = collections.defaultdict() >>> d defaultdict(None, {}) >>> e = collections.defaultdict(str) >>> e defaultdict(<class 'str'>, {})defaultdict的一個(gè)典型用法是使用其中一種內(nèi)置類型(如str、int、list或dict)作為默認(rèn)工廠,因?yàn)檫@些內(nèi)置類型在沒有參數(shù)調(diào)用時(shí)返回空類型。
>>> d = collections.defaultdict(str) >>> d defaultdict(<class 'str'>, {}) >>> d['hello'] '' >>> d defaultdict(<class 'str'>, {'hello': ''}) # 普通字典調(diào)用不存在的鍵時(shí),將會(huì)拋異常 >>> e = {} >>> e['hello'] Traceback (most recent call last):File "<stdin>", line 1, in <module> KeyError: 'hello'使用int作為default_factory的例子:
>>> from collections import defaultdict >>> fruit = defaultdict(int) >>> fruit['apple'] += 2 >>> fruit defaultdict(<class 'int'>, {'apple': 2}) >>> fruit defaultdict(<class 'int'>, {'apple': 2}) >>> fruit['banana'] # 沒有對(duì)象時(shí),返回0 0 >>> fruit defaultdict(<class 'int'>, {'apple': 2, 'banana': 0})使用list作為default_factory的例子:
>>> s = [('NC', 'Raleigh'), ('VA', 'Richmond'), ('WA', 'Seattle'), ('NC', 'Asheville')] >>> d = collections.defaultdict(list) >>> for k,v in s: ... d[k].append(v) ... >>> d defaultdict(<class 'list'>, {'NC': ['Raleigh', 'Asheville'], 'VA': ['Richmond'], 'WA': ['Seattle']})OrderedDict
Python字典中的鍵的順序是任意的:它們不受添加的順序的控制。collections.OrderedDict類提供了保留他們添加順序的字典對(duì)象。
>>> from collections import OrderedDict >>> o = OrderedDict() >>> o['key1'] = 'value1' >>> o['key2'] = 'value2' >>> o['key3'] = 'value3' >>> o OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])如果在已經(jīng)存在的key上添加新的值,將會(huì)保留原來的key的位置,然后覆蓋value值。
>>> o['key1'] = 'value5' >>> o OrderedDict([('key1', 'value5'), ('key2', 'value2'), ('key3', 'value3')])OrderedDict對(duì)象的字典對(duì)象,如果其順序不同那么Python也會(huì)把他們當(dāng)做是兩個(gè)不同的對(duì)象,請(qǐng)看事例:
print '\nOrderedDict:' d4=collections.OrderedDict() d4['a']='A' d4['b']='B' d4['c']='C'd5=collections.OrderedDict() d5['c']='C' d5['a']='A' d5['b']='B'print d1==d2OrderedDict: False按key值或value值排序
dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} #按key排序 kd = collections.OrderedDict(sorted(dd.items(), key=lambda t:t[0])) print kd #按照value排序 vd = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1])) print vd#輸出 OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])獲得“OrderedDict”第一項(xiàng)的簡(jiǎn)單方法
from collections import OrderedDict o = OrderedDict() o['first'] = 123 o['second'] = 234 o['third'] = 345first_item = o.popitem(last=False) >>> ('first', 123)namedtuple
三種定義命名元組的方法:第一個(gè)參數(shù)是命名元組的構(gòu)造器(如下的:Person,Human)
>>> from collections import namedtuple >>> Person = namedtuple('Person', ['age', 'height', 'name']) >>> Human = namedtuple('Human', 'age, height, name') >>> Human2 = namedtuple('Human2', 'age height name')實(shí)例化命令元組
>>> tom = Person(30,178,'Tom') >>> jack = Human(20,179,'Jack') >>> tom Person(age=30, height=178, name='Tom') >>> jack Human(age=20, height=179, name='Jack') >>> tom.age #直接通過 實(shí)例名+.+屬性 來調(diào)用 30 >>> jack.name 'Jack'deque
collections.deque返回一個(gè)新的雙向隊(duì)列對(duì)象,從左到右初始化(用方法 append()) ,從 iterable (迭代對(duì)象) 數(shù)據(jù)創(chuàng)建。如果 iterable 沒有指定,新隊(duì)列為空。
collections.deque隊(duì)列支持線程安全,對(duì)于從兩端添加(append)或者彈出(pop),復(fù)雜度O(1)。
雖然list對(duì)象也支持類似操作,但是這里優(yōu)化了定長(zhǎng)操作(pop(0)、insert(0,v))的開銷。
如果 maxlen 沒有指定或者是 None ,deques 可以增長(zhǎng)到任意長(zhǎng)度。否則,deque就限定到指定最大長(zhǎng)度。一旦限定長(zhǎng)度的deque滿了,當(dāng)新項(xiàng)加入時(shí),同樣數(shù)量的項(xiàng)就從另一端彈出。
支持的方法:
- append(x):添加x到右端
- appendleft(x):添加x到左端
- clear():清楚所有元素,長(zhǎng)度變?yōu)?
- copy():創(chuàng)建一份淺拷貝
- count(x):計(jì)算隊(duì)列中個(gè)數(shù)等于x的元素
- extend(iterable):在隊(duì)列右側(cè)添加iterable中的元素
- extendleft(iterable):在隊(duì)列左側(cè)添加iterable中的元素,注:在左側(cè)添加時(shí),iterable參數(shù)的順序?qū)?huì)反過來添加
- index(x[,start[,stop]]):返回第 x 個(gè)元素(從 start 開始計(jì)算,在 stop 之前)。返回第一個(gè)匹配,如果沒找到的話,升起 ValueError 。
- insert(i,x):在位置 i 插入 x 。注:如果插入會(huì)導(dǎo)致一個(gè)限長(zhǎng)deque超出長(zhǎng)度 maxlen 的話,就升起一個(gè) IndexError 。
- pop():移除最右側(cè)的元素
- popleft():移除最左側(cè)的元素
- remove(value):移去找到的第一個(gè) value。沒有拋出ValueError
- reverse():將deque逆序排列。返回 None 。
- maxlen:隊(duì)列的最大長(zhǎng)度,沒有限定則為None。
ChainMap
一個(gè) ChainMap 將多個(gè)字典或者其他映射組合在一起,創(chuàng)建一個(gè)單獨(dú)的可更新的視圖。 如果沒有 maps 被指定,就提供一個(gè)默認(rèn)的空字典 。ChainMap是管理嵌套上下文和覆蓋的有用工具。
>>> from collections import ChainMap >>> d1 = {'apple':1,'banana':2} >>> d2 = {'orange':2,'apple':3,'pike':1} >>> combined_d = ChainMap(d1,d2) >>> reverse_combind_d = ChainMap(d2,d1) >>> combined_d ChainMap({'apple': 1, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1}) >>> reverse_combind_d ChainMap({'orange': 2, 'apple': 3, 'pike': 1}, {'apple': 1, 'banana': 2}) >>> for k,v in combined_d.items(): ... print(k,v) ... pike 1 apple 1 banana 2 orange 2 >>> for k,v in reverse_combind_d.items(): ... print(k,v) ... pike 1 apple 3 banana 2 orange 2總結(jié)
以上是生活随笔為你收集整理的Python中collections模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: token和session的区别
- 下一篇: websocket python爬虫_p