1. 程式人生 > >Python模塊之collections

Python模塊之collections

刪除元素 line pri 內容 crs oda 介紹 cos 引用

模塊介紹

在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

  1. namedtuple: 生成可以使用名字來訪問元素內容的tuple
  2. deque: 雙端隊列,可以快速的從另外一側追加和推出對象
  3. Counter: 計數器,主要用來計數
  4. OrderedDict: 有序字典
  5. defaultdict: 帶有默認值的字典

應用

namedtuple

們知道tuple可以表示不變集合,例如,一個點的二維坐標就可以表示成:

>>> p = (1, 2)

但是,看到(1, 2),很難看出這個tuple是用來表示一個坐標的。

這時,namedtuple就派上了用場:

技術分享圖片
from collections import namedtuple
point = namedtuple(Point, [x, y])
p = point(1, 2)
print(p.x, p.y)
# 答案:
# 1 2
定義一個點

似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple定義:

#namedtuple(‘名稱‘, [屬性list]):
Circle = namedtuple(‘Circle‘, [‘x‘, ‘y‘, ‘r‘])

deque 

使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數據量大的時候,插入和刪除效率很低。

deque是為了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧:

技術分享圖片
from collections import deque
q = deque([a, b, c])
q.append(x)
q.appendleft(y)
print(q)
# 答案:
# deque([‘y‘, ‘a‘, ‘b‘, ‘c‘, ‘x‘])
插入數據

deque除了實現list的append()

pop()外,還支持appendleft()popleft(),這樣就可以非常高效地往頭部添加或刪除元素。

OrderedDict

使用dict時,Key是無序的。在對dict做叠代時,我們無法確定Key的順序。

如果要保持Key的順序,可以用OrderedDict

技術分享圖片
from collections import OrderedDict
d = dict([(a, 1), (b, 2), (c, 3)])
print(d)
od = OrderedDict([(a, 1), (b, 2), (c, 3)])
print(type(od), od[a])
od = OrderedDict()
od[z] = 1
od[y] = 2
od[x] = 3
print(od.keys())
# 答案:
{a: 1, b: 2, c: 3}
<class collections.OrderedDict> 1
odict_keys([z, y, x])
View Code

註意,OrderedDict的Key會按照插入的順序排列,不是Key本身排序。

defaultdict

有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大於 66 的值保存至字典的第一個key中,將小於 66 的值保存至第二個key的值中。

即: {‘k1‘: 大於66 , ‘k2‘: 小於66}: 技術分享圖片
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = {}
for value in values:
    if value > 66:
        if my_dict.__contains__(k1):   # 用於判斷鍵是否存在於字典中,如果鍵在字典dict裏返回true,否則返回false。
            my_dict[k1].append(value)
        else:
            my_dict[k1] = [value]
    else:
        if my_dict.__contains__(k2):
            my_dict[k2].append(value)
        else:
            my_dict[k2] = [value]
print(my_dict)
# 答案:
{k2: [11, 22, 33, 44, 55, 66], k1: [77, 88, 99, 90]}
原始方法 技術分享圖片
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
    if value > 66:
        my_dict[k1].append(value)
    else:
        my_dict[k2].append(value)
print(my_dict)
# 答案:
defaultdict(<class list>, {k2: [11, 22, 33, 44, 55, 66], k1: [77, 88, 99, 90]})
defaultdict方法

使dict時,如果引用的Key不存在,就會拋出KeyError。如果希望key不存在時,返回一個默認值,就可以用defaultdict

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: ‘N/A‘)
>>> dd[‘key1‘] = ‘abc‘
>>> dd[‘key1‘] # key1存在
‘abc‘
>>> dd[‘key2‘] # key2不存在,返回默認值
‘N/A‘

Counter

Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。Counter類和其他語言的bags或multisets很相似。

c = Counter(‘abcdeabcdabcaba‘)
print c
輸出:Counter({‘a‘: 5, ‘b‘: 4, ‘c‘: 3, ‘d‘: 2, ‘e‘: 1})
其他詳細內容 點擊這裏

Python模塊之collections