Python Collections模塊

      網(wǎng)友投稿 613 2025-04-01

      在內(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: 帶有默認(rèn)值的字典

      1、namedtuple

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

      >>>?p=(2,6)

      但是,看到(1, 2),很難看出這個tuple是用來表示一個坐標(biāo)的。

      這時,namedtuple就派上了用場:

      from?collections?import?namedtuple point?=?namedtuple("point",?['x',?'y']) print(point) p_obj?=?point(6,?8) print(p_obj.x) print(p_obj.y)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py 6 8 Process?finished?with?exit?code?0

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

      #?namedtuple('名稱',?[屬性list]): Circle?=?namedtuple("Circle",?['x',?'y',?'r']) cir?=?Circle(8,?6,?10) print(cir.x) print(cir.y) print(cir.r)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py 8 6 10 Process?finished?with?exit?code?0

      2、deque

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

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

      from?collections?import?deque q?=?deque(['a',?'b',?'c']) q.append('d') print(q) q.appendleft('e') print(q) q.pop() print(q) q.popleft() print(q)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py deque(['a',?'b',?'c',?'d']) deque(['e',?'a',?'b',?'c',?'d']) deque(['e',?'a',?'b',?'c']) deque(['a',?'b',?'c']) Process?finished?with?exit?code?0

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

      Python Collections模塊

      3、OrderedDict

      使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。

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

      from?collections?import?OrderedDict lis?=?[('a',?21),?('b',?55),?('c',?86)] dic?=?dict(lis)??#?dict的Key是無序的 print(dic) ord_dic?=?OrderedDict(lis)??#?OrderedDict的Key是有序的 print(ord_dic)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py {'a':?21,?'b':?55,?'c':?86} OrderedDict([('a',?21),?('b',?55),?('c',?86)]) Process?finished?with?exit?code?0

      注意,OrderedDict的Key會按照插入的順序排列,不是Key本身排序:

      ord_dic?=?OrderedDict() ord_dic['z']?=?99 ord_dic['y']?=?110 ord_dic['z']?=?666 print(ord_dic.keys())??#?按照插入的Key的順序返回

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py odict_keys(['z',?'y']) Process?finished?with?exit?code?0

      4、defaultdict

      有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大于?66?的值保存至字典的第一個key中,將小于?66?的值保存至第二個key的值中。

      即: {'k1': 大于66?,?'k2': 小于66}

      lis?=?[11,?22,?33,?55,?77,?66,?88,?99] dic?=?{} for?value?in?lis: ????if?value?>?66: ????????if?dic.has_key('k1'): ????????????dic['k1'].append(value) ????????else: ????????????dic['k1']?=?[value] ????else: ????????if?dic.has_key('k2'): ????????????dic['k2'].append(value) ????????else: ????????????dic['k2']?=?[value]

      from?collections?import?defaultdict lis?=?[11,?22,?33,?55,?77,?66,?88,?99] my_dic?=?defaultdict(lis) for?value?in?lis: ????if?value?>?66: ????????my_dic['k1'].append(value) ????else: ????????my_dic['k2'].append(value) print(my_dic)

      使用dict時,如果引用的Key不存在,就會拋出KeyError。如果希望key不存在時,返回一個默認(rèn)值,就可以用defaultdict:

      from?collections?import?defaultdict dd?=?defaultdict(lambda:?'N/A') dd['key1']?=?'abc'??#?key1存在 print(dd['key1']) print(dd['key2'])??#?key2不存在,返回默認(rèn)值 print(dd['key3'])

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py abc N/A N/A Process?finished?with?exit?code?0

      5、Counter

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

      from?collections?import?Counter coun?=?Counter("absdsdsdadsdsa") print(coun)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py Counter({'s':?5,?'d':?5,?'a':?3,?'b':?1}) Process?finished?with?exit?code?0

      創(chuàng)建

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

      from?collections?import?Counter c?=?Counter()??#?創(chuàng)建一個空的Counter類 print(c) c?=?Counter('g***d')??#?從一個可iterable對象(list、tuple、dict、字符串等)創(chuàng)建 print(c) c?=?Counter({'a':?4,?'b':?2})??#?從一個字典對象創(chuàng)建 print(c) c?=?Counter(a=4,?b=2)??#?從一組鍵值對創(chuàng)建 print(c)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter() Counter({'a':?3,?'l':?2,?'g':?1,?'h':?1,?'d':?1}) Counter({'a':?4,?'b':?2}) Counter({'a':?4,?'b':?2}) Process?finished?with?exit?code?0

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

      當(dāng)所訪問的鍵不存在時,返回0,而不是KeyError;否則返回它的計數(shù)。

      計數(shù)值的訪問

      from?collections?import?Counter cou?=?Counter("hello?world") print(cou["l"]) print(cou["o"]) print(cou["a"])

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py 3 2 0 Process?finished?with?exit?code?0

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

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

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

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

      from?collections?import?Counter cou?=?Counter("hello?world") cou.update("which")??#?使用另一個iterable對象更新 print(cou["h"]) c?=?Counter("watch") cou.update(c)??#?使用另一個Counter對象更新 print(cou["h"])

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py 3 4 Process?finished?with?exit?code?0

      減少則使用subtract()方法:

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

      from?collections?import?Counter c?=?Counter('which') print(c["h"]) c.subtract('witch')??#?使用另一個iterable對象更新 print(c['h']) d?=?Counter('watch') c.subtract(d)??#?使用另一個Counter對象更新 print(c['a'])

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py 2 1 -1 Process?finished?with?exit?code?0

      鍵的修改和刪除

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

      鍵的刪除

      from?collections?import?Counter c?=?Counter("abcdcba") print(c) c["b"]?=?0 print(c) del?c["a"] print(c)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?2,?'b':?2,?'c':?2,?'d':?1}) Counter({'a':?2,?'c':?2,?'d':?1,?'b':?0}) Counter({'c':?2,?'d':?1,?'b':?0}) Process?finished?with?exit?code?0

      elements()

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

      elements()方法

      from?collections?import?Counter c?=?Counter(a=4,?b=2,?c=0,?d=-2) print(list(c.elements()))

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py ['a',?'a',?'a',?'a',?'b',?'b'] Process?finished?with?exit?code?0

      most_common([n])

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

      most_common()方法

      from?collections?import?Counter c?=?Counter('abracadabra') print(c) print(c.most_common()) print(c.most_common(3))

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?5,?'b':?2,?'r':?2,?'c':?1,?'d':?1}) [('a',?5),?('b',?2),?('r',?2),?('c',?1),?('d',?1)] [('a',?5),?('b',?2),?('r',?2)] Process?finished?with?exit?code?0

      淺拷貝copy

      淺拷貝copy

      from?collections?import?Counter c?=?Counter("abcdcba") print(c) d?=?c.copy() print(d)

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?2,?'b':?2,?'c':?2,?'d':?1}) Counter({'a':?2,?'b':?2,?'c':?2,?'d':?1}) Process?finished?with?exit?code?0

      算術(shù)和集合操作

      +、-、&、|操作也可以用于Counter。其中&和|操作分別返回兩個Counter對象各元素的最小值和最大值。需要注意的是,得到的Counter對象將刪除小于1的元素。

      Counter對象的算術(shù)和集合操作

      from?collections?import?Counter c?=?Counter(a=3,?b=1) d?=?Counter(a=1,?b=2) print(c?+?d)??#?c[x]?+?d[x] print(c?-?d)??#?subtract(只保留正數(shù)計數(shù)的元素) print(c?&?d)??#?交集:??min(c[x],?d[x]) print(c?|?d)??#?并集:??max(c[x],?d[x])

      結(jié)果:

      D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?4,?'b':?3}) Counter({'a':?2}) Counter({'a':?1,?'b':?1}) Counter({'a':?3,?'b':?2}) Process?finished?with?exit?code?0

      其他常用操作

      下面是一些Counter類的常用操作,來源于Python官方文檔

      Counter類常用操作

      sum(c.values())??#?所有計數(shù)的總數(shù) c.clear()??#?重置Counter對象,注意不是刪除 list(c)??#?將c中的鍵轉(zhuǎn)為列表 set(c)??#?將c中的鍵轉(zhuǎn)為 setdict(c)??#?將c中的鍵值對轉(zhuǎn)為字典 c.items()??#?轉(zhuǎn)為(elem,?cnt)格式的列表 Counter(dict(list_of_pairs))??#?從(elem,?cnt)格式的列表轉(zhuǎn)換為Counter類對象 c.most_common()[:-n:-1]??#?取出計數(shù)最少的n個元素 c?+=?Counter()??#?移除0和負(fù)值

      軟件開發(fā) 人工智能 機器學(xué)習(xí) AI

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Posix線程 它們那一大家子事兒,要覺得好你就收藏進(jìn)被窩里慢慢看 (1)
      下一篇:華為(長沙DevCloud創(chuàng)新中心舉辦技術(shù)沙龍 助力企業(yè)提升軟件開發(fā)效率
      相關(guān)文章
      久久精品亚洲一区二区| 亚洲中文字幕无码中文字在线 | 精品国产日韩久久亚洲| 亚洲精品在线不卡| 91嫩草私人成人亚洲影院| 亚洲AV乱码久久精品蜜桃| 国产亚洲精品观看91在线| 亚洲日韩aⅴ在线视频| 国产AV无码专区亚洲Av| 亚洲国产精品久久久天堂| 亚洲av无码一区二区乱子伦as| 亚洲国产精品VA在线看黑人| 亚洲国产精品乱码一区二区| 久久久久亚洲AV片无码| 亚洲电影国产一区| 337p日本欧洲亚洲大胆精品555588| 亚洲国产成人久久精品影视| 亚洲精品在线播放视频| 亚洲一区二区影院| 亚洲综合小说久久另类区| 亚洲国产午夜精品理论片| 中文字幕无码亚洲欧洲日韩| 亚洲а∨精品天堂在线| 亚洲高清免费视频| 中文字幕在线亚洲精品| 久久亚洲国产中v天仙www| 亚洲最大福利视频网站| 亚洲性69影院在线观看| 2020国产精品亚洲综合网 | 亚洲精品国产精品乱码视色 | 中文字幕无码亚洲欧洲日韩| 久久久久亚洲AV无码去区首| 亚洲va中文字幕无码| 国产亚洲AV夜间福利香蕉149| 亚洲AV无码一区二区三区系列| 亚洲黄色在线观看| 亚洲 欧洲 自拍 另类 校园| 九九精品国产亚洲AV日韩| 亚洲天堂在线视频| 亚洲AV无码乱码在线观看富二代| 亚洲精品美女久久久久|