天天看點

python3 collections子產品_Python3 collections子產品的使用

collections

介紹

collections是Python内建的一個集合子產品,提供了許多有用的集合類和方法。

可以把它了解為一個容器,裡面提供Python标準内建容器 dict , list , set , 和 tuple 的替代選擇。

importcollectionsprint(dir(collections))#['ChainMap', 'Counter', 'Mapping', 'MutableMapping', 'OrderedDict', 'UserDict', 'UserList', 'UserString', '_Link', '_OrderedDictItemsView', '_OrderedDictKeysView', '_OrderedDictValuesView', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__getattr__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_chain', '_collections_abc', '_count_elements', '_eq', '_heapq', '_iskeyword', '_itemgetter', '_nt_itemgetters', '_proxy', '_recursive_repr', '_repeat', '_starmap', '_sys', 'abc', 'defaultdict', 'deque', 'namedtuple']

裡面有許多方法,我們隻介紹常用的方法。

常用方法

namedtuple(): 建立一個命名元組子類的工廠函數

deque :     高效增删改雙向清單,類似清單(list)的容器,實作了在兩端快速添加(append)和彈出(pop)

defaultdict : 當字典查詢時,為key不存在提供一個預設值。

OrderedDict : 有序詞典,就是記住了插入順序

Counter : 計數功能

1. namedtuple() 命名元組

參數

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

typename :  命名的名字,傳回一個新的元組子類,名為 typename

field_names : 可以是一個['x', 'y']這樣的序列,也可以是'x, y'或者'x y'

rename :   python3.1添加,如果 rename 為真, 無效域名會自動轉換成位置名。比如 ['abc', 'def', 'ghi', 'abc'] 轉換成 ['abc', '_1', 'ghi', '_3'] , 消除關鍵詞 def 和重複域名 abc 。

defaults :  python3.7添加, defaults 可以為 None 或者是一個預設值的 iterable(可疊代對象)。如果一個預設值域必須跟其他沒有預設值的域在一起出現, defaults 就應用到最右邊的參數。比如如果域名 ['x', 'y', 'z'] 和預設值 (1, 2) ,那麼 x 就必須指定一個參數值 ,y 預設值 1 , z 預設值 2 。

module :   python3.6添加,如果 module 值有定義,命名元組的 __module__ 屬性值就被設定。

使用

例如我想定義一個點(x, y),可以給它起個名字為Points

importcollections

point= collections.namedtuple('Points', ['x', 'y'])

p1= point(2, 3)

p2= point(4, 2)print(p1) #Points(x=2, y=3)

print(p2) #Points(x=4, y=2)

用 isinstance 判斷其類型

print(isinstance(p1, point)) #True

print(isinstance(p1, tuple)) #True

可以發現它即屬于 point 類型,也屬于 tuple 類型。

使用 _make 指派

a= [11, 3]

p1._make(a)print(p1) #Points(x=11, y=3)

使用 _replace 更改值

p1._replace(x=5)print(p1) #Points(x=5, y=3)

2. deque 雙端隊列

參數

collections.deque([iterable[, maxlen]])

傳回一個新的雙向隊列對象,從左到右初始化(用方法 append()) ,從 iterable (疊代對象) 資料建立。如果 iterable 沒有指定,新隊列為空。

iterable :疊代對象,可以是字元串,清單等可疊代對象。

maxlen : maxlen 沒有指定或者是 None , deque 可以增長到任意長度。否則, deque 就限定到指定最大長度。一旦限定長度的 deque 滿了,當新項加入時,同樣數量的項就從另一端彈出。

使用

from collections importdeque

q= deque(['a', 'b', 'c'], maxlen=10)#從右邊添加一個元素

q.append('d')print(q) #deque(['a', 'b', 'c', 'd'], maxlen=10)

#從左邊删除一個元素

print(q.popleft()) #a

print(q) #deque(['b', 'c', 'd'], maxlen=10)

#擴充隊列

q.extend(['i', 'j'])print(q) #deque(['b', 'c', 'd', 'i', 'j'], maxlen=10)

#查找下标

print(q.index('c')) #1

#移除第一個'd'

q.remove('d')print(q) #deque(['b', 'c', 'i', 'j'], maxlen=10)

#逆序

q.reverse()print(q) #deque(['j', 'i', 'c', 'b'], maxlen=10)

#最大長度

print(q.maxlen) #10

方法全:

python3 collections子產品_Python3 collections子產品的使用
python3 collections子產品_Python3 collections子產品的使用

append(x):添加 x 到右端。

appendleft(x):添加 x 到左端。

clear():移除所有元素,使其長度為0.

copy():建立一份淺拷貝。3.5 新版功能.

count(x):計算deque中個數等于 x 的元素。3.2 新版功能.

extend(iterable):擴充deque的右側,通過添加iterable參數中的元素。

extendleft(iterable):擴充deque的左側,通過添加iterable參數中的元素。注意,左添加時,在結果中iterable參數中的順序将被反過來添加。

index(x[, start[, stop]]):傳回第 x 個元素(從 start 開始計算,在 stop 之前)。傳回第一個比對,如果沒找到的話,升起 ValueError 。3.5 新版功能.

insert(i, x):在位置 i 插入 x 。如果插入會導緻一個限長deque超出長度 maxlen 的話,就升起一個 IndexError 。3.5 新版功能.

pop():移去并且傳回一個元素,deque最右側的那一個。如果沒有元素的話,就升起 IndexError 索引錯誤。

popleft():移去并且傳回一個元素,deque最左側的那一個。如果沒有元素的話,就升起 IndexError 索引錯誤。

remove(value):移去找到的第一個 value。 如果沒有的話就升起 ValueError 。

reverse():将deque逆序排列。傳回 None 。3.2 新版功能.

rotate(n=1):向右循環移動 n 步。 如果 n 是負數,就向左循環。如果deque不是空的,向右循環移動一步就等價于 d.appendleft(d.pop()) , 向左循環一步就等價于 d.append(d.popleft()) 。

Deque對象同樣提供了一個隻讀屬性:

maxlen:Deque的最大尺寸,如果沒有限定的話就是 None 。

全部方法

3. defaultdict 預設值字典

使用

當key不存在時傳回預設值

from collections importdefaultdict

dd= defaultdict(lambda: 'not exist')

dd['key1'] = 'abc'

print(dd['key1']) #key1存在#'abc'

print(dd['key2']) #key2不存在,傳回預設值#'not exist'

使用 list 作為 default_factory ,很容易将序列作為鍵值對加入字典:

from collections importdefaultdict

d=defaultdict(list)

s= [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]for k, v ins:

d[k].append(v)print(d) #defaultdict(, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})

相當于

d ={}

s= [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]for k, v ins:

d.setdefault(k, []).append(v)print(d) #{'yellow': [1, 3], 'blue': [2, 4], 'red': [1]}

設定 default_factory 為 int ,可以很好的用于計數

s = 'mississippi'd=defaultdict(int)for k ins:

d[k]+= 1

print(d) #defaultdict(, {'m': 1, 'i': 4, 's': 4, 'p': 2})

4. OrderedDict 有序字典

有序詞典就像正常詞典一樣,但有一些與排序操作相關的額外功能。

但是内置的 dict 類已經有了記住插入順序的能力(在 Python 3.7 中保證了這種新行為),是以它變得不那麼重要了。

使用

popitem(last=True) :有序字典的 popitem() 方法移除并傳回一個 (key, value) 鍵值對。 如果 last 值為真,則按 LIFO 後進先出的順序傳回鍵值對,否則就按 FIFO 先進先出的順序傳回鍵值對。

from collections importOrderedDict

d= OrderedDict(a=1, b=2, c=3, d=4,e=5)print(d) #OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])

print(d.popitem(last=True)) #('e', 5)

print(d.popitem(last=False)) #('a', 1)

print(d) #OrderedDict([('b', 2), ('c', 3), ('d', 4)]

move_to_end(key, last=True) :将現有 key 移動到有序字典的任一端。 如果 last 為真值(預設)則将元素移至末尾;如果 last 為假值則将元素移至開頭。如果 key 不存在則會觸發 KeyError。

from collections importOrderedDict

d= OrderedDict(a=1, b=2, c=3, d=4,e=5)print(d) #OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])

d.move_to_end(key='c', last=True)print(d) #OrderedDict([('a', 1), ('b', 2), ('d', 4), ('e', 5), ('c', 3)])

d.move_to_end(key='b', last=False)print(d) #OrderedDict([('b', 2), ('a', 1), ('d', 4), ('e', 5), ('c', 3)])

5. Counter 計數

Counter 是一個 dict 的子類,用于計數可哈希對象。特别友善!

使用

字元串

from collections importCounter

c=Counter()for i in 'sfsadfsdjklgsdla':

c[i]+= 1

print(isinstance(c,Counter)) #True

print(isinstance(c,dict)) #True

print(c) #Counter({'s': 4, 'd': 3, 'f': 2, 'a': 2, 'l': 2, 'j': 1, 'k': 1, 'g': 1})

c2= Counter('asfjslfjsdlfjgkls')print(c2) #Counter({'s': 4, 'd': 3, 'f': 2, 'a': 2, 'l': 2, 'j': 1, 'k': 1, 'g': 1})

清單

from collections importCounter

c= Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])print(c) #Counter({'blue': 3, 'red': 2, 'green': 1})

elements() :傳回一個疊代器,其中每個元素将重複出現計數值所指定次。 元素會按首次出現的順序傳回。 如果一個元素的計數值小于一, elements() 将會忽略它。

c = Counter(a=4, b=2, c=0, d=-2)print(sorted(c.elements())) #['a', 'a', 'a', 'a', 'b', 'b']

most_common([n]) :傳回一個清單,其中包含 n 個最常見的元素及出現次數,按常見程度由高到低排序。 如果 n 被省略或為 None, most_common() 将傳回計數器中的 所有元素。 計數值相等的元素按首次出現的順序排序:

c = Counter('abracadabra')print(c.most_common(3)) #[('a', 5), ('b', 2), ('r', 2)]

subtract([iterable-or-mapping]) :從 疊代對象 或 映射對象 減去元素。像 dict.update() 但是是減去,而不是替換。輸入和輸出都可以是0或者負數。

c = Counter(a=4, b=2, c=0, d=-2)

d= Counter(a=1, b=2, c=3, d=4)

c.subtract(d)print(c) #Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

附上中文文檔,走起...

。。