天天看點

collections子產品

  collections子產品在内置資料類型(dict、list、set、tuple)的基礎上,還提供了幾個額外的資料類型:ChainMap、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就能用上了。 

namedtuple('名稱',‘屬性list’)

from collections import namedtuple
Point = namedtuple('Point',['x','y'])
p = Point(1,2)
print(p.x)  # 1
print(p.y)  # 2           

複制

可以驗證建立的Point對象是tuple的一種子類:

print(isinstance(p,Point))  # True
print(isinstance(p,tuple))  # True           

複制

deque

使用list存儲資料時,按索引通路元素很快,但是插入和删除元素就很慢了,因為list是線性存儲,資料量大的時候,插入和删除效率很低。deque為了高效實作插入和删除操作的雙向清單,适合用于隊列和棧。

from collections import deque
q = deque(['a','b','c','d'])
q.append('e')
q.appendleft('A')
print(q)    # deque(['A', 'a', 'b', 'c', 'd', 'e'])
q.pop()
q.popleft()
print(q)    # deque(['a', 'b', 'c', 'd'])           

複制

defaultdict

使用dict時,如果引用的Key不存在,就會抛出異常。如果希望key不存在時,傳回一個預設值,就可以使用defaultdict。

from collections import defaultdict
d = defaultdict(lambda:'N/A')
d['key1'] = 'abc'
print(d['key1'])    # abc
print(d['key2'])    # N/A           

複制

注意預設值是調用函數傳回的,而函數在建立defaultdict對象是傳入。

除了在key不存在時傳回預設值,defaultdict的其他行為跟dict是完全一樣的。

OrderDict

使用字典時,key是無序的。在對字典做疊代時,我們無法确定key的順序。如果要保持key的順序,可以用OrderedDict

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是有序的           

複制

注意,

OrderedDict

的Key會按照插入的順序排列,不是Key本身排序:

from collections import OrderedDict
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(od.keys())    # odict_keys(['z', 'y', 'x'])           

複制

Counter

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

from collections import Counter
c = Counter()
for i in 'asdsadsafjzjk':
    c[i]+=1
print(c)    # Counter({'a': 3, 's': 3, 'd': 2, 'j': 2, 'f': 1, 'z': 1, 'k': 1})

cc = Counter('asdsadsafjzjk')
print(cc)   # Counter({'a': 3, 's': 3, 'd': 2, 'j': 2, 'f': 1, 'z': 1, 'k': 1})           

複制