日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python中collections模块

發(fā)布時(shí)間:2024/4/15 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中collections模块 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • Python中collections模塊:模塊實(shí)現(xiàn)了特定目標(biāo)的容器,以提供Python標(biāo)準(zhǔn)內(nèi)建容器 dict、list、set、tuple 的替代選擇。
    • Counter:字典的子類,提供了可哈希對(duì)象的計(jì)數(shù)功能
    • defaultdict:字典的子類,提供了一個(gè)工廠函數(shù),為字典查詢提供了默認(rèn)值
    • OrderedDict:字典的子類,保留了他們被添加的順序
    • namedtuple:創(chuàng)建命名元組子類的工廠函數(shù)
    • deque:類似列表容器,實(shí)現(xiàn)了在兩端快速添加(append)和彈出(pop)
    • ChainMap:類似字典的容器類,將多個(gè)映射集合到一個(gè)視圖里面

Counter

Counter是一個(gè)dict子類,主要是用來對(duì)你訪問的對(duì)象的頻率進(jìn)行計(jì)數(shù)。
常用方法:

  • elements():返回一個(gè)迭代器,每個(gè)元素重復(fù)計(jì)算的個(gè)數(shù),如果一個(gè)元素的計(jì)數(shù)小于1,就會(huì)被忽略。
  • most_common([n]):返回一個(gè)列表,提供n個(gè)訪問頻率最高的元素和計(jì)數(shù)
  • subtract([iterable-or-mapping]):從迭代對(duì)象中減去元素,輸入輸出可以是0或者負(fù)數(shù)
  • update([iterable-or-mapping]):從迭代對(duì)象計(jì)數(shù)元素或者從另一個(gè) 映射對(duì)象 (或計(jì)數(shù)器) 添加。
# 統(tǒng)計(jì)字符出現(xiàn)的次數(shù) >>> import collections >>> collections.Counter('hello world') Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1}) # 統(tǒng)計(jì)單詞數(shù) >>> collections.Counter('hello world hello world hello nihao'.split()) Counter({'hello': 3, 'world': 2, 'nihao': 1})

常用的方法:

>>> c = collections.Counter('hello world hello world hello nihao'.split()) >>> c Counter({'hello': 3, 'world': 2, 'nihao': 1}) # 獲取指定對(duì)象的訪問次數(shù),也可以使用get()方法 >>> c['hello'] 3# 查看元素 >>> list(c.elements()) ['hello', 'hello', 'hello', 'world', 'world', 'nihao']# 追加對(duì)象,或者使用c.update(d) >>> d = collections.Counter('hello world'.split()) >>> c + d Counter({'hello': 4, 'world': 3, 'nihao': 1})# 減少對(duì)象,或者使用c.subtract(d) >>> c - d Counter({'hello': 2, 'world': 1, 'nihao': 1})# 清除 >>> c.clear() >>> c Counter()

defaultdict

collections.defaultdict(default_factory)為字典的沒有的key提供一個(gè)默認(rèn)的值。參數(shù)應(yīng)該是一個(gè)函數(shù),當(dāng)沒有參數(shù)調(diào)用時(shí)返回默認(rèn)值。如果沒有傳遞任何內(nèi)容,則默認(rèn)為None。

>>> d = collections.defaultdict() >>> d defaultdict(None, {}) >>> e = collections.defaultdict(str) >>> e defaultdict(<class 'str'>, {})

defaultdict的一個(gè)典型用法是使用其中一種內(nèi)置類型(如str、int、list或dict)作為默認(rèn)工廠,因?yàn)檫@些內(nèi)置類型在沒有參數(shù)調(diào)用時(shí)返回空類型。

>>> d = collections.defaultdict(str) >>> d defaultdict(<class 'str'>, {}) >>> d['hello'] '' >>> d defaultdict(<class 'str'>, {'hello': ''}) # 普通字典調(diào)用不存在的鍵時(shí),將會(huì)拋異常 >>> e = {} >>> e['hello'] Traceback (most recent call last):File "<stdin>", line 1, in <module> KeyError: 'hello'

使用int作為default_factory的例子:

>>> from collections import defaultdict >>> fruit = defaultdict(int) >>> fruit['apple'] += 2 >>> fruit defaultdict(<class 'int'>, {'apple': 2}) >>> fruit defaultdict(<class 'int'>, {'apple': 2}) >>> fruit['banana'] # 沒有對(duì)象時(shí),返回0 0 >>> fruit defaultdict(<class 'int'>, {'apple': 2, 'banana': 0})

使用list作為default_factory的例子:

>>> s = [('NC', 'Raleigh'), ('VA', 'Richmond'), ('WA', 'Seattle'), ('NC', 'Asheville')] >>> d = collections.defaultdict(list) >>> for k,v in s: ... d[k].append(v) ... >>> d defaultdict(<class 'list'>, {'NC': ['Raleigh', 'Asheville'], 'VA': ['Richmond'], 'WA': ['Seattle']})

OrderedDict

Python字典中的鍵的順序是任意的:它們不受添加的順序的控制。collections.OrderedDict類提供了保留他們添加順序的字典對(duì)象。

>>> from collections import OrderedDict >>> o = OrderedDict() >>> o['key1'] = 'value1' >>> o['key2'] = 'value2' >>> o['key3'] = 'value3' >>> o OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])

如果在已經(jīng)存在的key上添加新的值,將會(huì)保留原來的key的位置,然后覆蓋value值。

>>> o['key1'] = 'value5' >>> o OrderedDict([('key1', 'value5'), ('key2', 'value2'), ('key3', 'value3')])

OrderedDict對(duì)象的字典對(duì)象,如果其順序不同那么Python也會(huì)把他們當(dāng)做是兩個(gè)不同的對(duì)象,請(qǐng)看事例:

print '\nOrderedDict:' d4=collections.OrderedDict() d4['a']='A' d4['b']='B' d4['c']='C'd5=collections.OrderedDict() d5['c']='C' d5['a']='A' d5['b']='B'print d1==d2OrderedDict: False

按key值或value值排序

dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} #按key排序 kd = collections.OrderedDict(sorted(dd.items(), key=lambda t:t[0])) print kd #按照value排序 vd = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1])) print vd#輸出 OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

獲得“OrderedDict”第一項(xiàng)的簡(jiǎn)單方法

from collections import OrderedDict o = OrderedDict() o['first'] = 123 o['second'] = 234 o['third'] = 345first_item = o.popitem(last=False) >>> ('first', 123)

namedtuple

三種定義命名元組的方法:第一個(gè)參數(shù)是命名元組的構(gòu)造器(如下的:Person,Human)

>>> from collections import namedtuple >>> Person = namedtuple('Person', ['age', 'height', 'name']) >>> Human = namedtuple('Human', 'age, height, name') >>> Human2 = namedtuple('Human2', 'age height name')

實(shí)例化命令元組

>>> tom = Person(30,178,'Tom') >>> jack = Human(20,179,'Jack') >>> tom Person(age=30, height=178, name='Tom') >>> jack Human(age=20, height=179, name='Jack') >>> tom.age #直接通過 實(shí)例名+.+屬性 來調(diào)用 30 >>> jack.name 'Jack'

deque

collections.deque返回一個(gè)新的雙向隊(duì)列對(duì)象,從左到右初始化(用方法 append()) ,從 iterable (迭代對(duì)象) 數(shù)據(jù)創(chuàng)建。如果 iterable 沒有指定,新隊(duì)列為空。
collections.deque隊(duì)列支持線程安全,對(duì)于從兩端添加(append)或者彈出(pop),復(fù)雜度O(1)。
雖然list對(duì)象也支持類似操作,但是這里優(yōu)化了定長(zhǎng)操作(pop(0)、insert(0,v))的開銷。
如果 maxlen 沒有指定或者是 None ,deques 可以增長(zhǎng)到任意長(zhǎng)度。否則,deque就限定到指定最大長(zhǎng)度。一旦限定長(zhǎng)度的deque滿了,當(dāng)新項(xiàng)加入時(shí),同樣數(shù)量的項(xiàng)就從另一端彈出。
支持的方法:

  • append(x):添加x到右端
  • appendleft(x):添加x到左端
  • clear():清楚所有元素,長(zhǎng)度變?yōu)?
  • copy():創(chuàng)建一份淺拷貝
  • count(x):計(jì)算隊(duì)列中個(gè)數(shù)等于x的元素
  • extend(iterable):在隊(duì)列右側(cè)添加iterable中的元素
  • extendleft(iterable):在隊(duì)列左側(cè)添加iterable中的元素,注:在左側(cè)添加時(shí),iterable參數(shù)的順序?qū)?huì)反過來添加
  • index(x[,start[,stop]]):返回第 x 個(gè)元素(從 start 開始計(jì)算,在 stop 之前)。返回第一個(gè)匹配,如果沒找到的話,升起 ValueError 。
  • insert(i,x):在位置 i 插入 x 。注:如果插入會(huì)導(dǎo)致一個(gè)限長(zhǎng)deque超出長(zhǎng)度 maxlen 的話,就升起一個(gè) IndexError 。
  • pop():移除最右側(cè)的元素
  • popleft():移除最左側(cè)的元素
  • remove(value):移去找到的第一個(gè) value。沒有拋出ValueError
  • reverse():將deque逆序排列。返回 None 。
  • maxlen:隊(duì)列的最大長(zhǎng)度,沒有限定則為None。
>>> from collections import deque >>> d = deque(maxlen=10) >>> d deque([], maxlen=10) >>> d.extend('python') >>> [i.upper() for i in d] ['P', 'Y', 'T', 'H', 'O', 'N'] >>> d.append('e') >>> d.appendleft('f') >>> d deque(['f', 'p', 'y', 't', 'h', 'o', 'n', 'e'], maxlen=10)

ChainMap

一個(gè) ChainMap 將多個(gè)字典或者其他映射組合在一起,創(chuàng)建一個(gè)單獨(dú)的可更新的視圖。 如果沒有 maps 被指定,就提供一個(gè)默認(rèn)的空字典 。ChainMap是管理嵌套上下文和覆蓋的有用工具。

>>> from collections import ChainMap >>> d1 = {'apple':1,'banana':2} >>> d2 = {'orange':2,'apple':3,'pike':1} >>> combined_d = ChainMap(d1,d2) >>> reverse_combind_d = ChainMap(d2,d1) >>> combined_d ChainMap({'apple': 1, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1}) >>> reverse_combind_d ChainMap({'orange': 2, 'apple': 3, 'pike': 1}, {'apple': 1, 'banana': 2}) >>> for k,v in combined_d.items(): ... print(k,v) ... pike 1 apple 1 banana 2 orange 2 >>> for k,v in reverse_combind_d.items(): ... print(k,v) ... pike 1 apple 3 banana 2 orange 2

總結(jié)

以上是生活随笔為你收集整理的Python中collections模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。