Python中的collections模塊詳解

其他關(guān)于Python的總結(jié)文章請(qǐng)?jiān)L問:http://www.reibang.com/nb/47435944

Python中的collections模塊詳解

collections 模塊給出了python中一些功能更加強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)、集合類

namedtuple

顧名思義,namedtuple就是有了名字的tuple茅特,聲明一個(gè)namedtuple類的時(shí)候可以傳入兩個(gè)參數(shù)兵睛,第一個(gè)是這個(gè)tuple的名字胚鸯,第二個(gè)是一個(gè)strlist形耗,依次說明其中每一個(gè)元素的名稱:

from collections import namedtuple

Point = namedtuple("Point", ['x', 'y'])
p = Point(1, 2)
print("Point at x={}, y={}".format(p.x, p.y))

運(yùn)行結(jié)果:

Point at x=1, y=2

再比如送滞,使用一個(gè)namedtuple來存儲(chǔ)一個(gè)馬爾可夫決策過程(Markov Decision Process,MDP)模型:

MDP = namedtuple("MDP", ['states', 'actions', 'transitions', 'rewards'])

deque

deque是一個(gè)雙向列表哼蛆,非常適用于隊(duì)列和棧,因?yàn)槠胀ǖ?code>list是一個(gè)線性結(jié)構(gòu)腾节,使用索引訪問元素時(shí)非常快跌前,但是對(duì)于插入和刪除就比較慢,所以deque可以提高插入和刪除的效率颅眶,可以使用list(a_deque)deque轉(zhuǎn)換成list

常用的方法:

  • append:向列表尾部添加元素
  • appendLeft:向列表頭部添加元素
  • pop:從列表尾部取出元素
  • popLeft:從列表頭部取出元素

一個(gè)例子:

from collections import deque

a = deque([1, 2, 3])
print(a)
a.append(4)
print(a)
a.appendleft(0)
print(a)
a.pop()
print(a)
a.popleft()
print(list(a))

運(yùn)行結(jié)果:

deque([1, 2, 3])
deque([1, 2, 3, 4])
deque([0, 1, 2, 3, 4])
deque([0, 1, 2, 3])
[1, 2, 3]

defaultdict

defaultdict是給不存在的key分配一個(gè)默認(rèn)值的字典过蹂,和普通的dict相比本橙,如果遇到key不存在的情況,不會(huì)拋出 KeyError啰挪,而是返回默認(rèn)值汁胆。其他的行為和dict一模一樣:

from collections import defaultdict

dd = defaultdict(lambda: 'DEFAULT VALUE')
dd['key1'] = 123
print(dd['key1'])
print(dd['key2'])

運(yùn)行結(jié)果為:

123
DEFAULT VALUE

OrderedDict

正如其名字所說猩谊,OrderedDict是一個(gè)有序的字典千劈,普通的dict中的key是沒有順序祭刚,即我們遍歷一個(gè)字典的時(shí)候是不知道它所遍歷的順序的,單獨(dú)OrderedDictkey進(jìn)行了排序墙牌,順序就是拆入鍵的順序涡驮,后插入的排在后邊,這樣在遍歷的時(shí)候就有了順序:

from collections import OrderedDict

od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])

od['d'] = 4

for item in od.items():
    print(item)

運(yùn)行結(jié)果為:

('a', 1)
('b', 2)
('c', 3)
('d', 4)

ChainMap

ChainMap是一個(gè)將多個(gè)dict按照循序串起來的數(shù)據(jù)結(jié)構(gòu)喜滨,在查找字典中的某一個(gè)鍵所對(duì)應(yīng)的值的時(shí)候捉捅,先從ChainMap中的第一個(gè)字典查起,如果該字典有該key虽风,就返回對(duì)應(yīng)的值棒口,沒有就依次往后查找后邊的dict

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'a': 'a', 'c': 'c'}
dict3 = {'a': 4, 'c': 5}

dicts = ChainMap(dict1, dict2, dict3)

print(dicts['a'])
print(dicts['b'])
print(dicts['c'])

獲得的結(jié)果為:

1
2
c

Counter

Counter是一個(gè)計(jì)數(shù)器辜膝,它是dict的一個(gè)子類无牵,可以根據(jù)鍵來區(qū)別記錄多個(gè)不同的計(jì)數(shù),相當(dāng)于一個(gè)計(jì)數(shù)器集合厂抖,還可以通過update函數(shù)一次性更新多個(gè)計(jì)數(shù)器:

from collections import Counter

counter = Counter()

for c in "hello world":
    counter[c] += 1

print(counter)

counter.update("hello world")

print(counter)

得到的結(jié)果:

Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
Counter({'l': 6, 'o': 4, 'h': 2, 'e': 2, ' ': 2, 'w': 2, 'r': 2, 'd': 2})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茎毁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忱辅,更是在濱河造成了極大的恐慌七蜘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墙懂,死亡現(xiàn)場(chǎng)離奇詭異橡卤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)损搬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門碧库,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人场躯,你說我怎么就攤上這事谈为。” “怎么了踢关?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵伞鲫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我签舞,道長(zhǎng)秕脓,這世上最難降的妖魔是什么柒瓣? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吠架,結(jié)果婚禮上芙贫,老公的妹妹穿的比我還像新娘。我一直安慰自己傍药,他們只是感情好磺平,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拐辽,像睡著了一般拣挪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俱诸,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天菠劝,我揣著相機(jī)與錄音,去河邊找鬼睁搭。 笑死赶诊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的园骆。 我是一名探鬼主播舔痪,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼遇伞!你這毒婦竟也來了辙喂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鸠珠,失蹤者是張志新(化名)和其女友劉穎巍耗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渐排,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炬太,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驯耻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亲族。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖可缚,靈堂內(nèi)的尸體忽然破棺而出霎迫,到底是詐尸還是另有隱情,我是刑警寧澤帘靡,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布知给,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涩赢。R本人自食惡果不足惜戈次,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筒扒。 院中可真熱鬧怯邪,春花似錦、人聲如沸花墩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽观游。三九已至搂捧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂缕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工王凑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搪柑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓索烹,卻偏偏與公主長(zhǎng)得像工碾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子百姓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容