模塊_collections

collections模塊

原文來(lái)自cnblog 的 Eva-J

Eva-J 介紹了collections模塊的常用方法,和演示實(shí)例

進(jìn)一步的使用技巧可以在 Python cookbook 的第一章中找到

在內(nèi)置數(shù)據(jù)類型(dict娱节、list、set、tuple)的基礎(chǔ)上,collections模塊還提供了幾個(gè)額外的數(shù)據(jù)類型:Counter狞玛、deque、defaultdict水慨、namedtuple和OrderedDict等湿颅。

  • 1.namedtuple: 生成可以使用名字來(lái)訪問(wèn)元素內(nèi)容的tuple

  • 2.deque: 雙端隊(duì)列,可以快速的從另外一側(cè)追加和推出對(duì)象

  • 3.Counter: 計(jì)數(shù)器床蜘,主要用來(lái)計(jì)數(shù)

  • 4.OrderedDict: 有序字典

  • 5.defaultdict: 帶有默認(rèn)值的字典

1.namedtuple 命名元祖

我們知道tuple可以表示不變集合辙培,例如,一個(gè)點(diǎn)的二維坐標(biāo)就可以表示成:

>>> p = (1, 2)

但是邢锯,看到(1, 2)扬蕊,很難看出這個(gè)tuple是用來(lái)表示一個(gè)坐標(biāo)的。

這時(shí)丹擎,namedtuple就派上了用場(chǎng):

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

類似的尾抑,如果要用坐標(biāo)和半徑表示一個(gè)圓,也可以用namedtuple定義:

#namedtuple('名稱', [屬性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

2.deque: 雙端隊(duì)列

使用list存儲(chǔ)數(shù)據(jù)時(shí)蒂培,按索引訪問(wèn)元素很快再愈,但是插入和刪除元素就很慢了,因?yàn)閘ist是線性存儲(chǔ)护戳,數(shù)據(jù)量大的時(shí)候翎冲,插入和刪除效率很低。

deque是為了高效實(shí)現(xiàn)插入和刪除操作的雙向列表灸异,適合用于隊(duì)列和棧:

>>> from collections import deque
>>> q = deque(['a', 'b', 'c']) # maxlen=3 指定隊(duì)列長(zhǎng)度 
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])

deque除了實(shí)現(xiàn)list的append()pop()外府适,還支持appendleft()popleft()羔飞,這樣就可以非常高效地往頭部添加或刪除元素。

  • 結(jié)合heapq模塊可以簡(jiǎn)單實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列
    可以參考cookbook 1.5章

3.Counter 統(tǒng)計(jì)計(jì)數(shù)

Counter類的目的是用來(lái)跟蹤值出現(xiàn)的次數(shù)檐春。它是一個(gè)無(wú)序的容器類型逻淌,以字典的鍵值對(duì)形式存儲(chǔ),其中元素作為key疟暖,其計(jì)數(shù)作為value卡儒。計(jì)數(shù)值可以是任意的Interger(包括0和負(fù)數(shù))。Counter類和其他語(yǔ)言的bags或multisets很相似俐巴。

c = Counter('abcdeabcdabcaba')
print c
輸出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})

4.OrderedDict: 有序字典

使用dict時(shí)骨望,Key是無(wú)序的。在對(duì)dict做迭代時(shí)欣舵,我們無(wú)法確定Key的順序擎鸠。

如果要保持Key的順序,可以用OrderedDict

>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是無(wú)序的
{'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會(huì)按照插入的順序排列劣光,不是Key本身排序:

>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> od.keys() # 按照插入的Key的順序返回
['z', 'y', 'x']

5.defaultdict: 帶有默認(rèn)值的字典

有如下值集合 [``11``,``22``,``33``,``44``,``55``,``66``,``77``,``88``,``99``,``90.``..],將所有大于 ``66` `的值保存至字典的第一個(gè)key中糟把,將小于 ``66` `的值保存至第二個(gè)key的值中绢涡。
即: {``'k1'``: 大于``66` `, ``'k2'``: 小于``66``}
values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = {}

for value in  values:
    if value>66:
        if my_dict.has_key('k1'):
            my_dict['k1'].append(value)
        else:
            my_dict['k1'] = [value]
    else:
        if my_dict.has_key('k2'):
            my_dict['k2'].append(value)
        else:
            my_dict['k2'] = [value]
from collections import defaultdict

values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = defaultdict(list)

for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)

使用dict時(shí),如果引用的Key不存在遣疯,就會(huì)拋出KeyError雄可。如果希望key不存在時(shí),返回一個(gè)默認(rèn)值缠犀,就可以用defaultdict

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在数苫,返回默認(rèn)值
'N/A'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市夭坪,隨后出現(xiàn)的幾起案子文判,更是在濱河造成了極大的恐慌过椎,老刑警劉巖室梅,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疚宇,居然都是意外死亡亡鼠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)敷待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)间涵,“玉大人,你說(shuō)我怎么就攤上這事榜揖」戳ǎ” “怎么了抗蠢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)思劳。 經(jīng)常有香客問(wèn)我迅矛,道長(zhǎng),這世上最難降的妖魔是什么潜叛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任秽褒,我火速辦了婚禮,結(jié)果婚禮上威兜,老公的妹妹穿的比我還像新娘销斟。我一直安慰自己,他們只是感情好椒舵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布蚂踊。 她就那樣靜靜地躺著,像睡著了一般笔宿。 火紅的嫁衣襯著肌膚如雪悴势。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天措伐,我揣著相機(jī)與錄音特纤,去河邊找鬼。 笑死侥加,一個(gè)胖子當(dāng)著我的面吹牛捧存,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播担败,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昔穴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了提前?” 一聲冷哼從身側(cè)響起吗货,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狈网,沒(méi)想到半個(gè)月后宙搬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拓哺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年勇垛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士鸥。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闲孤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烤礁,到底是詐尸還是另有隱情讼积,我是刑警寧澤肥照,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站勤众,受9級(jí)特大地震影響建峭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜决摧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一亿蒸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掌桩,春花似錦边锁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至则拷,卻和暖如春贡蓖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煌茬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工斥铺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坛善。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓晾蜘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親眠屎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剔交,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • Python 作為一個(gè)“內(nèi)置電池”的編程語(yǔ)言,標(biāo)準(zhǔn)庫(kù)里面擁有非常多好用的模塊改衩。比如今天想給大家 介紹的 colle...
    yongxinz閱讀 380評(píng)論 0 1
  • 基本介紹 Python擁有一些內(nèi)置的數(shù)據(jù)類型岖常,比如str, int, list, tuple, dict等, co...
    君惜丶閱讀 563評(píng)論 0 0
  • 1. namedtuple namedtuple是一個(gè)函數(shù)葫督,它用來(lái)創(chuàng)建一個(gè)自定義的tuple對(duì)象竭鞍,并且規(guī)定了tup...
    綠林好漢_文武閱讀 797評(píng)論 0 4
  • 簡(jiǎn)介 collections包含了一些特殊的容器,針對(duì)Python內(nèi)置的容器候衍,例如list笼蛛、dict洒放、set和tu...
    Boer223閱讀 13,568評(píng)論 0 11
  • 記得一年前的一天蛉鹿,爸爸突然對(duì)我說(shuō)要教我打籃球,“太棒了往湿!打籃球妖异?我半天就能學(xué)會(huì)惋戏!”我激動(dòng)地說(shuō)。爸爸說(shuō):“你別看著簡(jiǎn)...
    微涼_fa34閱讀 295評(píng)論 0 0