collections模塊使用方法

collections模塊基於Python中內置的dict、list、set和tuple數據類型實現了一些專門的容器,來擴展這些基礎類型變量的功能。app

namedtuple函數

原始的tuple只能經過index的方式訪問所包含的元素,namedtuple就至關於爲tuple和tuple中的元素取了新的名字,操做的時候能夠用這些名字直接去訪問(這種操做好像跟C裏面的struct差很少耶)。這種設置可讓咱們定義tuple變量的目的一目瞭然,因此用好它可讓咱們的代碼更易於維護。下面來看看具體怎麼用吧!ui

# 如今咱們想要定義一個類型專門用於保存座標
# 構造一個類專門去保存好像有點麻煩
# 這時namedtuple就派上用場啦

# 執行結果在下方
from collections import namedtuple
Posi = namedtuple('Positions', ('x', 'y'))
p = Posi(1, 2)	# 建立對象時記住要用Posi,Positions只是一個標識的名稱
print(p)
# Positions(x=1, y=2)
print(p.x, p.y)	# 記住tuple是不可修改的,因此不能給p.x從新賦值
# 1 2

沒錯,實例化的對象打印出來的就是咱們前面給它定義的名字,元素名稱也能夠用咱們給的名字來得到。比起老式的tuple,namedtuple簡直是太貼心,一眼就能看出來做用了。code

deque對象

deque是一個對list進行功能擴展的方法,說白了就是把list改爲了一個雙端隊列,可用於棧和隊列。雖然list對象也支持相似的操做,可是因爲線性存儲插入和刪除元素的時間複雜度是O(n),當數據量很大時效率很低。deque裏面有許多操做方法:排序

from collections import deque
que1 = deque([1,2,3,4,5])
que1.append(5)		# 向右添加元素
print(que1)
# deque([1, 2, 3, 4, 5, 5])
que1.appendleft(0)		# 向左添加元素
print(que1)
# deque([0, 1, 2, 3, 4, 5, 5])
que2 = que1.copy()		# 淺拷貝一個deque對象
print(que1,que2)
# deque([0, 1, 2, 3, 4, 5, 5]) deque([0, 1, 2, 3, 4, 5, 5])
que1.clear()	# 清空deque中元素
print(que1)
#deque([])
print(que2.count(5))	# 統計某一個元素的個數
# 2
que2.extend([6,7])		# 從右合併
que2.extendleft([-1,-2])	# 往左擴展時是倒序合併
print(que2)
# deque([-2, -1, 0, 1, 2, 3, 4, 5, 5, 6, 7])
que2.insert(4,1)	# 向指定位置插入元素,前一個參數爲位置,後一個爲值
print(que2)
# deque([-2, -1, 0, 1, 1, 2, 3, 4, 5, 5, 6, 7])
que2.pop()	# 右彈出值
que2.popleft()	# 坐彈出值
print(que2)
# deque([-1, 0, 1, 1, 2, 3, 4, 5, 5, 6])
que2.remove(1)	# 刪除第一個找到的值
print(que2)
# deque([-1, 0, 1, 2, 3, 4, 5, 5, 6])
que2.reverse()
print(que2)		# 將deque對象中的元素倒排
# deque([6, 5, 5, 4, 3, 2, 1, 0, -1])
que2.rotate(2)		# 將右邊的N個元素彈出並插入到左邊
print(que2)
# deque([0, -1, 6, 5, 5, 4, 3, 2, 1])

ChainMap繼承

ChainMap提供了一種能夠將多個映射做爲一個單元處理的策略。它每每比建立一個新字典而後用update()將原字典合併來的快得多。須要注意的是ChainMap是經過引用的方式來合併全部映射對象中的元素,因此當原映射對象中的元素改變時,合併後對象中的內容也會改變。隊列

from collections import ChainMap

attr1 = {'name':'Tom','Age':18}
attr2 = {'gender':'man','addr':'Beijing'}
people = ChainMap(attr1,attr2)	# 合併兩個字典
print(people)
# ChainMap({'name': 'Tom', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})
print(people['name'])
# Tom
attr1['name'] = 'Micheal'
print(attr1['name'], people['name'])	# 修改原字典中的值,合併後列表中的值也會改變
# Micheal Micheal
people = people.new_child({'country':'America'})	# new_child爲ChainMap實例合併新字典
print(people)
# ChainMap({'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})
print(people.parents)		# parents屬性指定的是父級內容,即實例變化前的內容
# ChainMap({'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})
print(people.parents.parents)		# 父級的父級內容
#ChainMap({'addr': 'Beijing', 'gender': 'man'})
print(people.maps)		# maps屬性返回的是將合併後的ChainMap實例拆分並保存爲list的結果,是最新的結果
# [{'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'}]
print(people)
# ChainMap({'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})

counterelement

counter提供的是一個方便又快速的計數器,統計出來的計數是用字典保存的,字段保存爲key,出現次數保存爲value。Counter能夠讀取任何字段的計數,不存在的字段默認計數爲0,value值也能夠爲負。使用方法以下:rem

from collections import Counter

c1 = Counter('hello world')
print(c1)
# Counter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'w': 1, 'h': 1, 'd': 1, 'r': 1})
c2 = Counter({'man':4, 'woman':2})
print(c2)
# Counter({'man': 4, 'woman': 2})
c3 = Counter(child=3, young=1,old=2)
print(c3.most_common(2))	# most_common方法會返回計數排名前N的元素
# [('child', 3), ('old', 2)]
print(list(c3.elements()))	# elements方法返回一個迭代器,裏面包含全部的key,數量與計數對應
# ['young', 'old', 'old', 'child', 'child', 'child']
c4 = Counter(child=2,young=1,old=1)
c3.subtract(c4)		# subtract方法用於從一個counter中減掉另外一個counter,key相同時對計數作減法
print(c3)
# Counter({'old': 1, 'child': 1, 'young': 0})
c5 = Counter(middle=3)
c4.subtract(c5)
print(c4)
# Counter({'child': 2, 'young': 1, 'old': 1, 'middle': -3})
del c3['child']	# del用於從字典中刪除某一個元素,這類操做一樣適用於Counter實例
print(c3['child'])
# 0

fruits1 = Counter({'apple':3,'orange':5,'banana':7})
fruits2 = Counter({'orange':2,'apple':1,'pear':4})
print(fruits1 - fruits2)	# Counter實例還可進行加減運算和按位與或
# Counter({'banana': 7, 'orange': 3, 'apple': 2})
print(fruits1 + fruits2)
# Counter({'banana': 7, 'orange': 7, 'pear': 4, 'apple': 4})
print(fruits1 & fruits2)
# Counter({'orange': 2, 'apple': 1})
print(fruits1 | fruits2)
# Counter({'banana': 7, 'orange': 5, 'pear': 4, 'apple': 3})

還須要注意的是,一些對字典的常規操做一樣對Counter也有效。可是fromkeys()在這裏不能做用於Counter實例,update()在這裏是新增Counter而不是代替舊的Counter,這兩種方法是例外。

OrderDict

常規的dict是隨機存儲的,這就致使了咱們對dict進行迭代的時候沒法確元素的順序。OrderDict可以有效的解決這個問題,可是返回的是插入時的順序,而不是根據key來排序(若是一開始就定義了元素,輸出時是隨機順序輸出的)。

from collections import OrderedDict
d = OrderedDict(a=1,b=2,c=3)
print(d)
# OrderedDict([('c', 3), ('a', 1), ('b', 2)])
print(d)
# OrderedDict([('c', 3), ('a', 1), ('b', 2)])
d['d'] = 4
print(d)
# OrderedDict([('c', 3), ('a', 1), ('b', 2), ('d', 4)])
print(d)	# 元素按照固定順序排列
# OrderedDict([('c', 3), ('a', 1), ('b', 2), ('d', 4)])
d = OrderedDict.fromkeys('abbcde')
print(d)
# rderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])
d.move_to_end('b')		# 將指定元素移動到末尾
print(d.keys())
# odict_keys(['a', 'c', 'd', 'e', 'b'])
d.move_to_end('d',last=False)		# 將指定元素移動到頭部
print(d.keys())
# odict_keys(['d', 'a', 'c', 'e', 'b'])
d.popitem()		# 移除末尾元素
print(d.keys())
# odict_keys(['d', 'a', 'c', 'e'])
d.popitem(last=False)		# 移除首部元素
print(d.keys())
# dict_keys(['a', 'c', 'e'])

defaultdict

通常的dict,若是試圖訪不存在的Key則會拋出KeyError錯誤。若是但願Key不存在的時候返回一個默認的value值,那麼defaultdict就派上用場了。(注意默認值是經過調用函數來帶回值)

from collections import defaultdict
dd = defaultdict(lambda : 0)
dd['a'] = 1
print(dd['a'])
# 1
print(dd['b'])
# 0

UserDict

用戶自定義字典類,能夠繼承該類並重寫規則。初始化時能夠用來拷貝一個字典的數據,而不是簡單的引用。

from collections import UserDict
dict = {'a':1,'b':2}
ud = UserDict(dict)
print(dict, ud)
# {'b': 2, 'a': 1} {'b': 2, 'a': 1}
ud['c'] = 3
print(dict, ud)
# {'b': 2, 'a': 1} {'c': 3, 'b': 2, 'a': 1}

UserList

用戶自定義列表類,能夠繼承該類並重寫規則。構建一個用戶自定義列表,初始化時能夠拷貝另一個列表中的內容。

from collections import UserList
li = [1,2,3,4]
l = li
ul = UserList(li)
del li[0]
print(l, li, ul)
# [2, 3, 4] [2, 3, 4] [1, 2, 3, 4]

UserString

用戶自定義字符串類,能夠繼承該類並重寫規則。初始化時能夠拷貝一個字符串。

from collections import UserString

s = 'hello world!'
us = UserString(s)
print(s, us)
# hello world! hello world!

轉載請註明出處,若有不正之處還望矯正,謝謝

相關文章
相關標籤/搜索