collections是Python內建的一個集合模塊,提供了許多有用的集合類和方法。html
能夠把它理解爲一個容器,裏面提供Python標準內建容器 dict
, list
, set
, 和 tuple
的替代選擇。python
import collections print(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']
裏面有許多方法,咱們只介紹經常使用的方法。app
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
['abc', 'def', 'ghi', 'abc']
轉換成 ['abc', '_1', 'ghi', '_3']
, 消除關鍵詞 def 和重複域名 abc
。None
或者是一個默認值的 iterable(可迭代對象)。若是一個默認值域必須跟其餘沒有默認值的域在一塊兒出現, defaults 就應用到最右邊的參數。好比若是域名 ['x', 'y', 'z']
和默認值 (1, 2)
,那麼 x
就必須指定一個參數值 ,y
默認值 1
, z
默認值 2
。__module__
屬性值就被設置。例如我想定義一個點(x, y),能夠給它起個名字爲Pointside
import collections 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 類型。ui
使用 _make 賦值spa
a= [11, 3] p1._make(a) print(p1) # Points(x=11, y=3)
使用 _replace 更改值code
p1._replace(x=5) print(p1) # Points(x=5, y=3)
collections.deque([iterable[, maxlen]])
返回一個新的雙向隊列對象,從左到右初始化(用方法 append()
) ,從 iterable (迭代對象) 數據建立。若是 iterable 沒有指定,新隊列爲空。htm
None
, deque 能夠增加到任意長度。不然, deque 就限定到指定最大長度。一旦限定長度的 deque 滿了,當新項加入時,一樣數量的項就從另外一端彈出。from collections import deque 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
方法全:對象
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 。
當key不存在時返回默認值
from collections import defaultdict
dd = defaultdict(lambda: 'not exist') dd['key1'] = 'abc' print(dd['key1']) # key1存在 # 'abc' print(dd['key2']) # key2不存在,返回默認值 # 'not exist'
使用 list
做爲 default_factory
,很容易將序列做爲鍵值對加入字典:
from collections import defaultdict d = defaultdict(list) s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] for k, v in s: d[k].append(v) print(d) # defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})
至關於
d = {} s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] for k, v in s: 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 in s: d[k] += 1 print(d) # defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})
有序詞典就像常規詞典同樣,但有一些與排序操做相關的額外功能。
可是內置的 dict 類已經有了記住插入順序的能力(在 Python 3.7 中保證了這種新行爲),因此它變得不那麼重要了。
popitem(last=True) :有序字典的 popitem() 方法移除並返回一個 (key, value) 鍵值對。 若是 last 值爲真,則按 LIFO 後進先出的順序返回鍵值對,不然就按 FIFO 先進先出的順序返回鍵值對。
from collections import OrderedDict 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 import OrderedDict 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)])
Counter 是一個 dict 的子類,用於計數可哈希對象。特別方便!
字符串
from collections import Counter 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 import Counter 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})
附上中文文檔,走起...
。。