Python中關(guān)于collections模塊的使用

在內(nèi)置數(shù)據(jù)類型(dict、list蒋伦、set、tuple)的基礎(chǔ)上焚鹊,collections模塊還提供了幾個額外的數(shù)據(jù)類型:Counter痕届、deque、defaultdict末患、namedtuple和OrderedDict等研叫。

  1. namedtuple: 生成可以使用名字來訪問元素內(nèi)容的tuple
  2. deque: 雙端隊列,可以快速的從另外一側(cè)追加和推出對象
  3. Counter: 計數(shù)器璧针,主要用來計數(shù)
  4. OrderedDict: 有序字典
  5. defaultdict: 帶有默認值的字典

namedtuple

我們知道tuple可以表示不變集合嚷炉,例如,一個點的二維坐標就可以表示成:

>>> p = (1, 2)

但是探橱,看到(1, 2)申屹,很難看出這個tuple是用來表示一個坐標的绘证。

這時,namedtuple就派上了用場:

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

類似的哗讥,如果要用坐標和半徑表示一個圓嚷那,也可以用namedtuple定義:

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

deque

使用list存儲數(shù)據(jù)時,按索引訪問元素很快忌栅,但是插入和刪除元素就很慢了车酣,因為list是線性存儲,數(shù)據(jù)量大的時候索绪,插入和刪除效率很低湖员。

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

>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])

deque除了實現(xiàn)list的append()和pop()外瑞驱,還支持appendleft()和popleft()娘摔,這樣就可以非常高效地往頭部添加或刪除元素。

OrderedDict

使用dict時唤反,Key是無序的凳寺。在對dict做迭代時,我們無法確定Key的順序彤侍。

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

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

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

defaultdict

有如下值集合 [11,22,33,44,55,66,77,88,99,90...]晒奕,將所有大于 66 的值保存至字典的第一個key中,將小于 66 的值保存至第二個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時脑慧,如果引用的Key不存在,就會拋出KeyError砰盐。如果希望key不存在時闷袒,返回一個默認值,就可以用defaultdict:

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在岩梳,返回默認值
'N/A'

Counter

Counter類的目的是用來跟蹤值出現(xiàn)的次數(shù)囊骤。它是一個無序的容器類型,以字典的鍵值對形式存儲蒋腮,其中元素作為key淘捡,其計數(shù)作為value。計數(shù)值可以是任意的Interger(包括0和負數(shù))池摧。Counter類和其他語言的bags或multisets很相似焦除。

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

下面的代碼說明了Counter類創(chuàng)建的四種方法:
Counter類的創(chuàng)建

>>> c = Counter()  # 創(chuàng)建一個空的Counter類
>>> c = Counter('gallahad')  # 從一個可iterable對象(list、tuple作彤、dict膘魄、字符串等)創(chuàng)建
>>> c = Counter({'a': 4, 'b': 2})  # 從一個字典對象創(chuàng)建
>>> c = Counter(a=4, b=2)  # 從一組鍵值對創(chuàng)建

計數(shù)值的訪問與缺失的鍵

當所訪問的鍵不存在時乌逐,返回0,而不是KeyError创葡;否則返回它的計數(shù)浙踢。

計數(shù)值的訪問

>>> c = Counter("abcdefgab")
>>> c["a"]
2
>>> c["c"]
1
>>> c["h"]
0
計數(shù)器的更新(update和subtract)

可以使用一個iterable對象或者另一個Counter對象來更新鍵值。

計數(shù)器的更新包括增加和減少兩種灿渴。其中洛波,增加使用update()方法:

計數(shù)器的更新(update)

>>> c = Counter('which')
>>> c.update('witch')  # 使用另一個iterable對象更新
>>> c['h']
3
>>> d = Counter('watch')
>>> c.update(d)  # 使用另一個Counter對象更新
>>> c['h']
4

減少則使用subtract()方法:

計數(shù)器的更新(subtract)

>>> c = Counter('which')
>>> c.subtract('witch')  # 使用另一個iterable對象更新
>>> c['h']
1
>>> d = Counter('watch')
>>> c.subtract(d)  # 使用另一個Counter對象更新
>>> c['a']
-1
鍵的修改和刪除

當計數(shù)值為0時,并不意味著元素被刪除骚露,刪除元素應(yīng)當使用del蹬挤。

鍵的刪除

>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> c["b"] = 0
>>> c
Counter({'a': 2, 'c': 2, 'd': 1, 'b': 0})
>>> del c["a"]
>>> c
Counter({'c': 2, 'b': 2, 'd': 1})

elements()

返回一個迭代器。元素被重復(fù)了多少次棘幸,在該迭代器中就包含多少個該元素焰扳。元素排列無確定順序,個數(shù)小于1的元素不被包含误续。

elements()方法 
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
most_common([n])

返回一個TopN列表吨悍。如果n沒有被指定,則返回所有元素蹋嵌。當多個元素計數(shù)值相同時育瓜,排列是無確定順序的。

most_common()方法

>>> c = Counter('abracadabra')
>>> c.most_common()
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
>>> c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)] 
淺拷貝copy
淺拷貝copy
>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> d = c.copy()
>>> d
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栽烂,一起剝皮案震驚了整個濱河市爆雹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愕鼓,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慧起,死亡現(xiàn)場離奇詭異菇晃,居然都是意外死亡,警方通過查閱死者的電腦和手機蚓挤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門磺送,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灿意,你說我怎么就攤上這事估灿。” “怎么了缤剧?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵馅袁,是天一觀的道長。 經(jīng)常有香客問我荒辕,道長汗销,這世上最難降的妖魔是什么犹褒? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮弛针,結(jié)果婚禮上叠骑,老公的妹妹穿的比我還像新娘。我一直安慰自己削茁,他們只是感情好宙枷,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茧跋,像睡著了一般慰丛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厌衔,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天璧帝,我揣著相機與錄音,去河邊找鬼富寿。 笑死睬隶,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的页徐。 我是一名探鬼主播苏潜,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼变勇!你這毒婦竟也來了恤左?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤搀绣,失蹤者是張志新(化名)和其女友劉穎飞袋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體链患,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡巧鸭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了麻捻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纲仍。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贸毕,靈堂內(nèi)的尸體忽然破棺而出郑叠,到底是詐尸還是另有隱情,我是刑警寧澤明棍,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布乡革,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏署拟。R本人自食惡果不足惜婉宰,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望推穷。 院中可真熱鬧心包,春花似錦、人聲如沸馒铃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽区宇。三九已至娃殖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間议谷,已是汗流浹背炉爆。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卧晓,地道東北人芬首。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像逼裆,于是被迫代替她去往敵國和親郁稍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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