《Python》常用模塊之collections模塊
阿新 • • 發佈:2018-09-05
() 原生 取值 print get() 常用模塊 isp sla type 在Python3.6之前使用dict,key是無序的。在對dict做叠代時,我們無法確定key的順序。
內置的數據類型:
int float complex
str list tuple
dict set
基礎數據類型:
int float complex
str list tuple
dict
collections模塊:
根據基礎數據類型又做了一些擴展
1、OrderdDict:有序字典 Python3.6以後自動有序
2、defaultdict:默認字典
3、Counter: 計數器
4、namedtuple:可命名元祖
5、deque:雙端隊列
1、OrderdDict:(有序字典)
如果要保持key的順序,key用OrderdDict:
from collections import OrderedDict d = dict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) print(d) # {‘a‘: 1, ‘c‘: 3, ‘b‘: 2} dict的key是無序的 od = OrderedDict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) print(od) # OrderedDict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) OrderedDict的Key是有序的
from collections import OrderedDict dd = OrderedDict([(‘a‘, 1), (‘k1‘, ‘v1‘)]) print(dd) # OrderedDict([(‘a‘, 1), (‘k1‘, ‘v1‘)]) for k in dd: print(k, dd[k]) # a 1 k1 v1 dd[‘k2‘] = ‘v2‘ print(dd) # OrderedDict([(‘a‘, 1), (‘k1‘, ‘v1‘), (‘k2‘, ‘v2‘)])
2、defaultdict:(默認字典)
有一個列表 [
11
,
22
,
33
,
44
,
55
,
66
,
77
,
88
,
99
,
90
],將所有大於
66
的值保存至字典的第一個key中,將小於
66
的值保存至第二個key的值中。
即:{‘k1’:大於66,‘k2’:小於66}
lst = [11, 22, 33, 44, 55, 66, 77, 88, 99 ,90] dic = {} for i in lst: if i > 66: if dic.get(‘k1‘): dic[‘k1‘].append(i) else: dic[‘k1‘] = [i] elif i < 66: if dic.get(‘k2‘): dic[‘k2‘].append(i) else: dic[‘k2‘] = [i] print(dic) # {‘k2‘: [11, 22, 33, 44, 55], ‘k1‘: [77, 88, 99, 90]}原生字典解決方法
from collections import defaultdict lst = [11, 22, 33, 44, 55, 66, 77, 88, 99 ,90] dic = defaultdict(list) for i in lst: if i > 66: dic[‘v1‘].append(i) elif i < 66: dic[‘v2‘].append(i) print(dic) # defaultdict(<class ‘list‘>, {‘v2‘: [11, 22, 33, 44, 55], ‘v1‘: [77, 88, 99, 90]}) print(dic[‘v1‘]) # [77, 88, 99, 90] print(dic[‘v2‘]) # [11, 22, 33, 44, 55]defaultdict解決方法
使用dict時,如果引用的key不存在,就會報錯。如果希望key不存在時,返回一個默認值,就可以使用defaultdict:
from collections import defaultdict d = defaultdict(lambda : ‘default‘) print(d) # defaultdict(<function <lambda> at 0x01368D68>, {}) print(d[‘k1‘]) # k1不存在,使用默認值:default print(d[‘k2‘]) # k2不存在,使用默認值:default d[‘k3‘] = ‘vvvvv‘ # k3自定義值 print(d) # defaultdict(<function <lambda> at 0x00798D68>, {‘k1‘: ‘default‘, ‘k2‘: ‘default‘, ‘k3‘: ‘vvvvv‘}) d = defaultdict(list) print(d[‘k1‘]) # [] d[‘k2‘].append(123) print(d) # defaultdict(<class ‘list‘>, {‘k1‘: [], ‘k2‘: [123]})
3、Counter(計數器)
Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為key,其計數作為value。
from collections import Counter
c = Counter(‘sdghjasihgaosjdoiasfsfas‘) print(c) # Counter({‘s‘: 6, ‘a‘: 4, ‘d‘: 2, ‘g‘: 2, ‘h‘: 2, ‘j‘: 2, ‘i‘: 2, ‘o‘: 2, ‘f‘: 2}) # 刪除一個值 del c[‘a‘] print(c) # Counter({‘s‘: 6, ‘d‘: 2, ‘g‘: 2, ‘h‘: 2, ‘j‘: 2, ‘i‘: 2, ‘o‘: 2, ‘f‘: 2})
4、namedtuple:(可命名元祖)
時間模塊中的結構化時間用的就是可命名元祖
from collections import namedtuple birth = namedtuple(‘Struct_time‘, [‘year‘, ‘month‘, ‘day‘]) b1 = birth(2018, 9, 5) print(type(b1)) # <class ‘__main__.Struct_time‘> print(b1.year) # 2018 print(b1.month) # 9 print(b1.day) # 5 print(b1) # Struct_time(year=2018, month=9, day=5) ‘‘‘ 可命名元組非常類似一個只有屬性沒有方法的類 [‘year‘,‘month‘,‘day‘]是對象屬性名 Struct_time是類 的名字 這個類最大的特點就是一旦實例化 不能修改屬性的值 ‘‘‘
5、deque:雙端隊列
使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數據量大的時候,插入和刪除效率很低。
deque是為了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧:
from collections import deque dq = deque() dq.append(1) dq.append(2) dq.append(3) dq.appendleft(4) print(dq) # deque([4, 1, 2, 3]) print(dq.pop()) # 3 print(dq) # deque([4, 1, 2]) print(dq.popleft()) # 4 print(dq) # deque([1, 2])
import queue q = queue.Queue() #隊列 q.put(1) q.put(2) q.put(‘aaa‘) q.put([1, 2, 3]) q.put({‘k1‘:1, ‘k2‘:2}) print(q) # <queue.Queue object at 0x004BE490> print(q.get()) # 1 print(q.get()) # 2 print(q.get()) # aaa # 一個個添加,一個個取值,先進先出
《Python》常用模塊之collections模塊