1. 程式人生 > >《Python》常用模塊之collections模塊

《Python》常用模塊之collections模塊

() 原生 取值 print get() 常用模塊 isp sla type

內置的數據類型:

  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:(有序字典)

    

在Python3.6之前使用dict,key是無序的。在對dict做叠代時,我們無法確定key的順序。

    如果要保持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模塊