collections常用模塊

official link:
https://docs.python.org/3/library/collections.html#module-collections

The following contents are extracted from python's source code:

'''This module implements specialized container datatypes providing
alternatives to Python's general purpose built-in containers, dict,
list, set, and tuple.

* namedtuple   factory function for creating tuple subclasses with named fields
* deque        list-like container with fast appends and pops on either end
* ChainMap     dict-like class for creating a single view of multiple mappings
* Counter      dict subclass for counting hashable objects
* OrderedDict  dict subclass that remembers the order entries were added
* defaultdict  dict subclass that calls a factory function to supply missing values
* UserDict     wrapper around dictionary objects for easier dict subclassing
* UserList     wrapper around list objects for easier list subclassing
* UserString   wrapper around string objects for easier string subclassing

'''
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
>>> p.y

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

namedtuple('名稱(chēng)', [屬性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])
deque

使用list存儲(chǔ)數(shù)據(jù)時(shí)阱扬,按照索引訪問(wèn)元素很快,但是插入和刪除元素就很慢了伸辟,因?yàn)閘ist是現(xiàn)行存儲(chǔ)麻惶,數(shù)據(jù)量大的時(shí)候,插入和刪除效率很低信夫。
deque是高效實(shí)現(xiàn)插入和刪除操作的雙向列表窃蹋,適合用于隊(duì)列和棧:

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

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

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']
defaultdict

有如下值集合 [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]

defaultdict 的解決辦法

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)

defaultdict字典解決方法
Counter

Counter類(lèi)的目的是用來(lái)跟蹤值出現(xiàn)的次數(shù)力试。它是一個(gè)無(wú)序的容器類(lèi)型徙邻,以字典的鍵值對(duì)形式存儲(chǔ),其中元素作為key懂版,其計(jì)數(shù)作為value鹃栽。計(jì)數(shù)值可以是任意的Interger(包括0和負(fù)數(shù))躏率。Counter類(lèi)和其他語(yǔ)言的bags或multisets很相似躯畴。

輸出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})</pre>

計(jì)算一篇文章出現(xiàn)的單詞數(shù)目
fname = input('Please enter your filename:')
with open(fname,'r') as f:
    num_words = 0
    for line in f:
        words = line.split()
        num_words += len(words)
    print('Num_words:',num_words)

計(jì)算一篇文章每個(gè)單詞的頻率
fname = input('please enter a filename:')

word_dict = dict()
with open(fname,'r',encoding='utf-8') as f:
    for line in f:
        for words in line.split(' '):
            if words not in word_dict:
                word_dict[words] = 1
            else:
                word_dict[words] += 1
c = Counter(word_dict)
print(c.most_common())
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓬抄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夯到,更是在濱河造成了極大的恐慌嚷缭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耍贾,死亡現(xiàn)場(chǎng)離奇詭異阅爽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晃听,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)百侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人能扒,你說(shuō)我怎么就攤上這事佣渴。” “怎么了初斑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵辛润,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我见秤,道長(zhǎng)砂竖,這世上最難降的妖魔是什么灵迫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮晦溪,結(jié)果婚禮上瀑粥,老公的妹妹穿的比我還像新娘。我一直安慰自己三圆,他們只是感情好狞换,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舟肉,像睡著了一般修噪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上路媚,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天黄琼,我揣著相機(jī)與錄音,去河邊找鬼整慎。 笑死脏款,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裤园。 我是一名探鬼主播撤师,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拧揽!你這毒婦竟也來(lái)了剃盾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淤袜,失蹤者是張志新(化名)和其女友劉穎痒谴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铡羡,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡积蔚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓖墅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库倘。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖论矾,靈堂內(nèi)的尸體忽然破棺而出教翩,到底是詐尸還是另有隱情,我是刑警寧澤贪壳,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響彪笼,放射性物質(zhì)發(fā)生泄漏钻注。R本人自食惡果不足惜配猫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一幅恋、第九天 我趴在偏房一處隱蔽的房頂上張望泵肄。 院中可真熱鬧捆交,春花似錦、人聲如沸腐巢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肉瓦。三九已至,卻和暖如春胃惜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛹疯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工戒财, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捺弦。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像孝扛,于是被迫代替她去往敵國(guó)和親列吼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苦始,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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