Python Collections 庫介紹
namedtuple 包
namedtuple 能夠創建和 tuple 類似的對象,只是 namedtuple 類本身和對應元素都可以具有一個名字,有點類似於沒有方法的普通類。
from collections import namedtuple
# 定義一個namedtuple類型User,幷包含name,sex和age屬性。
User = namedtuple('User', ['name', 'sex', 'age'])
# 創建一個User對象
user = User(name='kongxx', sex='male', age=21)
# 也可以通過一個list來創建一個User對象,這裏注意需要使用"_make"方法
user = User._make(['kongxx', 'male', 21])
print user
# User(name='user1', sex='male', age=21)
# 獲取用戶的屬性
print user.name
print user.sex
print user.age
# 修改對象屬性,注意要使用"_replace"方法
user = user._replace(age=22)
print user
# User(name='user1', sex='male', age=22)
# 將User對象轉換成字典,注意要使用"_asdict"
print user._asdict()
# OrderedDict([('name', 'kongxx'), ('sex', 'male'), ('age', 22)])
deque 包
內部實現的雙向隊列,基本操作如下
- 左右元素處理操作:append,appendleft,extend,extendleft,pop,popleft
- 中間元素操作:insert(在某個位置插入),remove(從刪除第一個出現的指定值,不存在返回 ValueError)
- 元素整體操作:clear(清空隊列),copy(實現隊列淺拷貝),count(統計隊列中某個元素的個數),index(從start到stop返回元素第一次出現的下標,不存在返回 ValueError),reverse(本地反轉),rotate(向右循環移動,負向左)
- 魔術函數:+(類似extend),+=,*(對應內容複製多少份),*=,in,len,del(刪除某個位置的元素),[](根據下標對值的獲取或賦值),()(傳入可迭代對象初始化隊列),比較操作(==, >, <, >=, <= 依次比較兩個隊列的元素)
from collections import deque
d = deque([1,2,3])
d.extendleft(['a','b','c'])
print(d)
deque(['c', 'b', 'a', 1, 2, 3])
ChainMap 包
hainMap是python3的新特性,它用來將多個map組成一個新的單元(原來的map結構仍然存在,類似於這些map被存在了一個list之中),這比新建一個map再將其他map用update加進來快得多。通過ChainMap可以來模擬嵌套的情景,而且多用於模板之中。
ChainMap支持普通map的所有操作,下面主要展示一下它的特性:
# 新建ChainMap及它的結構
In[2]: from collections import ChainMap
In[3]: m1 = {'color': 'red', 'user': 'guest'}
In[4]: m2 = {'name': 'drfish', 'age': '18'}
In[5]: chainMap = ChainMap(m1, m2)
In[6]: print(chainMap.items())
ItemsView(ChainMap({'user': 'guest', 'color': 'red'}, {'age': '18', 'name': 'drfish'}))
# 獲取ChainMap中的元素
In[7]: print(chainMap.get('name'))
drfish
In[8]: print(chainMap.get('not'))
None
# 新增map
In[9]: m3 = {'data': '1-6'}
In[10]: chainMap = chainMap.new_child(m3)
In[11]: print(chainMap.items())
ItemsView(ChainMap({'data': '1-6'}, {'user': 'guest', 'color': 'red'}, {'age': '18', 'name': 'drfish'}))
# parents屬性
In[12]: print(chainMap.parents)
ChainMap({'user': 'guest', 'color': 'red'}, {'age': '18', 'name': 'drfish'})
In[13]: print(chainMap.parents.parents)
ChainMap({'age': '18', 'name': 'drfish'})
In[14]: print(chainMap.parents.parents.parents)
ChainMap({})
# maps屬性
In[15]: chainMap.maps
Out[15]:
[{'data': '1-6'},
{'color': 'red', 'user': 'guest'},
{'age': '18', 'name': 'drfish'}]
Counter 包
字典的子類,記錄可哈希對象出現的次數
首先 Counter 有多種初始化方式
>>> c = Counter() # a new, empty counter
>>> c = Counter('gallahad') # a new counter from an iterable
>>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping
>>> c = Counter(a=4, b=2) # a new counter from keyword args
主要的操作範例如下
>>> c = Counter('abcdeabcdabcaba') # count elements from a string
>>> c.most_common(3) # three most common elements
[('a', 5), ('b', 4), ('c', 3)]
>>> sorted(c) # list all unique elements
['a', 'b', 'c', 'd', 'e']
>>> ''.join(sorted(c.elements())) # list elements with repetitions
'aaaaabbbbcccdde'
>>> sum(c.values()) # total of all counts
15
>>> c['a'] # count of letter 'a'
5
>>> for elem in 'shazam': # update counts from an iterable
... c[elem] += 1 # by adding 1 to each element's count
>>> c['a'] # now there are seven 'a'
7
>>> del c['b'] # remove all 'b'
>>> c['b'] # now there are zero 'b'
0
>>> d = Counter('simsalabim') # make another counter
>>> c.update(d) # add in the second counter
>>> c['a'] # now there are nine 'a'
9
>>> c.clear() # empty the counter
>>> c
Counter()
Note: If a count is set to zero or reduced to zero, it will remain
in the counter until the entry is deleted or the counter is cleared:
>>> c = Counter('aaabbc')
>>> c['b'] -= 2 # reduce the count of 'b' by two
>>> c.most_common() # 'b' is still in, but its count is zero
[('a', 3), ('c', 1), ('b', 0)]
邏輯操作
>>> c = Counter('which')
>>> c.subtract('witch') # subtract elements from another iterable
>>> c.subtract(Counter('watch')) # subtract elements from another counter
>>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch
0
>>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch
-1
>>> Counter('abbb') + Counter('bcc')
Counter({'b': 4, 'c': 2, 'a': 1})
>>> Counter('abbbc') - Counter('bccd')
Counter({'b': 2, 'a': 1})
>>> Counter('abbb') | Counter('bcc')
Counter({'b': 3, 'c': 2, 'a': 1})
>>> Counter('abbb') & Counter('bcc')
Counter({'b': 1})
OrderedDict 包
提供一個有序的字典,從而可以實現遍歷操作。內部存儲順序根據傳入順序給定。
import collections
print 'Regular dictionary:'
d1={}
d1['a']='A'
d1['b']='B'
d1['c']='C'
d2={}
d2['c']='C'
d2['a']='A'
d2['b']='B'
print d1==d2
print '\nOrderedDict:'
d1=collections.OrderedDict()
d1['a']='A'
d1['b']='B'
d1['c']='C'
d2=collections.OrderedDict()
d2['c']='C'
d2['a']='A'
d2['b']='B'
print d1==d2
defaultdict 包
創建一個帶默認值的字典,默認值根據傳入的工廠函數
from collections import defaultdict
dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'
print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])
'''
0
set()
[]
'''