亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

Python的collections原來這么好用!

collections是實(shí)現(xiàn)了特定目標(biāo)的容器,以提供Python標(biāo)準(zhǔn)內(nèi)建容器 dict , list , set , 和 tuple 的替代選擇。為了讓大家更好的認(rèn)識(shí),本文詳細(xì)總結(jié)collections的相關(guān)知識(shí),一起來學(xué)習(xí)吧!

Python的collections原來這么好用!

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ù)。

>>>?import?collections
>>>?#?統(tǒng)計(jì)字符出現(xiàn)的次數(shù)
...?collections.Counter('hello?world')
Counter({'l':?3,?'o':?2,?'h':?1,?'e':?1,?'?':?1,?'w':?1,?'r':?1,?'d':?1})
>>>?#?統(tǒng)計(jì)單詞個(gè)數(shù)
...?collections.Counter('hello?world?hello?lucy'.split())
Counter({'hello':?2,?'world':?1,?'lucy':?1})

常用方法:

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?lucy'.split())
>>>?c
Counter({'hello':?2,?'world':?1,?'lucy':?1})
>>>?#?獲取指定對(duì)象的訪問次數(shù),也可以使用get方法
...?c['hello']
2
>>>?#?查看元素
...?list(c.elements())
['hello',?'hello',?'world',?'lucy']
>>>?c1?=?collections.Counter('hello?world'.split())
>>>?c2?=?collections.Counter('hello?lucy'.split())
>>>?c1
Counter({'hello':?1,?'world':?1})
>>>?c2
Counter({'hello':?1,?'lucy':?1})
>>>?#?追加對(duì)象,+或者c1.update(c2)
...?c1+c2
Counter({'hello':?2,?'world':?1,?'lucy':?1})
>>>?#?減少對(duì)象,-或者c1.subtract(c2)
...?c1-c2
Counter({'world':?1})
>>>?#?清除
...?c.clear()
>>>?c
Counter()

defaultdict

返回一個(gè)新的類似字典的對(duì)象。defaultdict 是內(nèi)置 dict 類的子類。

class?collections.defaultdict([default_factory[,?...]])

>>>?d?=?collections.defaultdict()
>>>?d
defaultdict(None,?{})
>>>?e?=?collections.defaultdict(str)
>>>?e
defaultdict(<class?'str'>,?{})

例子

defaultdict的一個(gè)典型用法是使用其中一種內(nèi)置類型(如str、int、list或dict等)作為默認(rèn)工廠,這些內(nèi)置類型在沒有參數(shù)調(diào)用時(shí)返回空類型。

>>>?e?=?collections.defaultdict(str)
>>>?e
defaultdict(<class?'str'>,?{})
>>>?e['hello']
''
>>>?e
defaultdict(<class?'str'>,?{'hello':?''})
>>>?#?普通字典調(diào)用不存在的鍵時(shí),報(bào)錯(cuò)
...?e1?=?{}
>>>?e1['hello']
Traceback?(most?recent?call?last):
??File?"<stdin>",?line?1,?in?<module>
KeyError:?'hello'

使用?int?作為?default_factory

>>>?fruit?=?collections.defaultdict(int)
>>>?fruit['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?=?[('yellow',?1),?('blue',?2),?('yellow',?3),?('blue',?4),?('red',?1)]
>>>?d?=?collections.defaultdict(list)
>>>?for?k,v?in?s:
...?????d[k].append(v)
...
>>>?d
defaultdict(<class?'list'>,?{'yellow':?[1,?3],?'blue':?[2,?4],?'red':?[1]})
>>>?d.items()
dict_items([('yellow',?[1,?3]),?('blue',?[2,?4]),?('red',?[1])])
>>>?sorted(d.items())
[('blue',?[2,?4]),?('red',?[1]),?('yellow',?[1,?3])]

使用?dict?作為?default_factory

```python
>>>?nums?=?collections.defaultdict(dict)
>>>?nums[1]?=?{'one':1}
>>>?nums
defaultdict(<class?'dict'>,?{1:?{'one':?1}})
>>>?nums[2]
{}
>>>?nums
defaultdict(<class?'dict'>,?{1:?{'one':?1},?2:?{}})

使用?set?作為?default_factory

```python
>>>?types?=?collections.defaultdict(set)
>>>?types['手機(jī)'].add('華為')
>>>?types['手機(jī)'].add('小米')
>>>?types['顯示器'].add('AOC')
>>>?types
defaultdict(<class?'set'>,?{'手機(jī)':?{'華為',?'小米'},?'顯示器':?{'AOC'}})

##?OrderedDict

Python字典中的鍵的順序是任意的,它們不受添加的順序的控制。

collections.OrderedDict 類提供了保留他們添加順序的字典對(duì)象。

```python
>>>?o?=?collections.OrderedDict()
>>>?o['k1']?=?'v1'
>>>?o['k3']?=?'v3'
>>>?o['k2']?=?'v2'
>>>?o
OrderedDict([('k1',?'v1'),?('k3',?'v3'),?('k2',?'v2')])

如果在已經(jīng)存在的 key 上添加新的值,將會(huì)保留原來的 key 的位置,然后覆蓋 value 值。

```python
>>>?o['k1']?=?666
>>>?o
OrderedDict([('k1',?666),?('k3',?'v3'),?('k2',?'v2')])
>>>?dict(o)
{'k1':?666,?'k3':?'v3',?'k2':?'v2'}

##?namedtuple

三種定義命名元組的方法:第一個(gè)參數(shù)是命名元組的構(gòu)造器(如下的:Person1,Person2,Person3)

```python
>>>?P1?=?collections.namedtuple('Person1',['name','age','height'])
>>>?P2?=?collections.namedtuple('Person2','name,age,height')
>>>?P3?=?collections.namedtuple('Person3','name?age?height')

實(shí)例化命名元組

```python
>>>?lucy?=?P1('lucy',23,180)
>>>?lucy
Person1(name='lucy',?age=23,?height=180)
>>>?jack?=?P2('jack',20,190)
>>>?jack
Person2(name='jack',?age=20,?height=190)
>>>?lucy.name??#?直接通過?實(shí)例名.屬性?來調(diào)用
'lucy'
>>>?lucy.age
23

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 ,deque 可以增長(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。

>>>?d?=?collections.deque(maxlen=10)
>>>?d
deque([],?maxlen=10)
>>>?d.extend('python')
>>>?[i.upper()?for?i?in?d]
['P',?'Y',?'T',?'H',?'O',?'N']
>>>?d.append('e')
>>>?d.appendleft('f')
>>>?d.appendleft('g')
>>>?d.appendleft('h')
>>>?d
deque(['h',?'g',?'f',?'p',?'y',?'t',?'h',?'o',?'n',?'e'],?maxlen=10)
>>>?d.appendleft('i')
>>>?d
deque(['i',?'h',?'g',?'f',?'p',?'y',?'t',?'h',?'o',?'n'],?maxlen=10)
>>>?d.append('m')
>>>?d
deque(['h',?'g',?'f',?'p',?'y',?'t',?'h',?'o',?'n',?'m'],?maxlen=10)

##?ChainMap

問題背景是我們有多個(gè)字典或者映射,想把它們合并成為一個(gè)單獨(dú)的映射,有人說可以用update進(jìn)行合并,這樣做的問題就是新建了一個(gè)數(shù)據(jù)結(jié)構(gòu)以致于當(dāng)我們對(duì)原來的字典進(jìn)行更改的時(shí)候不會(huì)同步。如果想建立一個(gè)同步的查詢方法,可以使用 ChainMap。

可以用來合并兩個(gè)或者更多個(gè)字典,當(dāng)查詢的時(shí)候,從前往后依次查詢。簡(jiǎn)單使用:

```python
>>>?d1?=?{'apple':1,'banana':2}
>>>?d2?=?{'orange':2,'apple':3,'pike':1}
>>>?combined1?=?collections.ChainMap(d1,d2)
>>>?combined2?=?collections.ChainMap(d2,d1)
>>>?combined1
ChainMap({'apple':?1,?'banana':?2},?{'orange':?2,?'apple':?3,?'pike':?1})
>>>?combined2
ChainMap({'orange':?2,?'apple':?3,?'pike':?1},?{'apple':?1,?'banana':?2})
>>>?for?k,v?in?combined1.items():
...?????print(k,v)
...
orange?2
apple?1
pike?1
banana?2
>>>?for?k,v?in?combined2.items():
...?????print(k,v)
...
apple?3
banana?2
orange?2
pike?1

有一個(gè)注意點(diǎn)就是當(dāng)對(duì)ChainMap進(jìn)行修改的時(shí)候總是只會(huì)對(duì)第一個(gè)字典進(jìn)行修改,如果第一個(gè)字典不存在該鍵,會(huì)添加。

>>>?d1?=?{'apple':1,'banana':2}
>>>?d2?=?{'orange':2,'apple':3,'pike':1}
>>>?c?=?collections.ChainMap(d1,d2)
>>>?c
ChainMap({'apple':?1,?'banana':?2},?{'orange':?2,?'apple':?3,?'pike':?1})
>>>?c['apple']
1
>>>?c['apple']?=?2
>>>?c
ChainMap({'apple':?2,?'banana':?2},?{'orange':?2,?'apple':?3,?'pike':?1})
>>>?c['pike']
1
>>>?c['pike']?=?3
>>>?c
ChainMap({'apple':?2,?'banana':?2,?'pike':?3},?{'orange':?2,?'apple':?3,?'pike':?1})

從原理上面講,ChainMap 實(shí)際上是把放入的字典存儲(chǔ)在一個(gè)隊(duì)列中,當(dāng)進(jìn)行字典的增加刪除等操作只會(huì)在第一個(gè)字典上進(jìn)行,當(dāng)進(jìn)行查找的時(shí)候會(huì)依次查找,new_child()?方法實(shí)質(zhì)上是在列表的第一個(gè)元素前放入一個(gè)字典,默認(rèn)是{},而 parents 是去掉了列表開頭的元素。

```python
>>>?a?=?collections.ChainMap()
>>>?a['x']?=?1
>>>?a
ChainMap({'x':?1})
>>>?b?=?a.new_child()
>>>?b
ChainMap({},?{'x':?1})
>>>?b['x']?=?2
>>>?b
ChainMap({'x':?2},?{'x':?1})
>>>?b['y']?=?3
>>>?b
ChainMap({'x':?2,?'y':?3},?{'x':?1})
>>>?a
ChainMap({'x':?1})
>>>?c?=?a.new_child()
>>>?c
ChainMap({},?{'x':?1})
>>>?c['x']?=?1
>>>?c['y']?=?1
>>>?c
ChainMap({'x':?1,?'y':?1},?{'x':?1})
>>>?d?=?c.parents
>>>?d
ChainMap({'x':?1})
>>>?d?is?a
False
>>>?d?==?a
True

>>>?a?=?{'x':1,'z':3}
>>>?b?=?{'y':2,'z':4}
>>>?c?=?collections.ChainMap(a,b)
>>>?c
ChainMap({'x':?1,?'z':?3},?{'y':?2,?'z':?4})
>>>?c.maps
[{'x':?1,?'z':?3},?{'y':?2,?'z':?4}]
>>>?c.parents
ChainMap({'y':?2,?'z':?4})
>>>?c.parents.maps
[{'y':?2,?'z':?4}]
>>>?c.parents.parents
ChainMap({})
>>>?c.parents.parents.parents
ChainMap({})

文章來源于網(wǎng)絡(luò),侵刪!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!