Python高階數據型別模組collections

2020-08-11 16:28:04

collections模組提供更加高階的容器數據型別,替代Python的內建dict,list, set,和tuple

Counter物件

提供計數器,支援方便和快速的計數。返回的是一個以元素爲鍵,出現次數爲值的字典

cnt = Counter()    #建立一個Counter物件
lst =['red', 'blue', 'red', 'green', 'blue', 'blue']
for word in lst:
  cnt[word] += 1
print cnt          # 輸出:Counter({'blue': 3, 'red': 2, 'green': 1})
c1 = Counter('gallahad')             #輸出:Counter({'a': 3, 'l': 2, 'h': 1, 'g': 1, 'd': 1})
c2 = Counter({'red': 4, 'blue': 2})  #輸出:Counter({'red': 4, 'blue': 2})
c3 = Counter(cats=4, dogs=8)         #輸出:Counter({'dogs': 8, 'cats': 4})
c4 = Counter(['eggs', 'ham'])        #輸出:Counter({'eggs': 1, 'ham': 1})

使用:Counter物件除了支援用於字典的所有方法(fromkeys和update除外)之外,還支援以下的三種方法

elements()

返回一個迭代器,重複每個重複次數的元素,計數小於1的被忽略。

c = Counter(a=4, b=2, c=0, d=-2)
i = c.elements()       #返回一個迭代器
list(i)                #輸出:['a', 'a', 'a', 'a', 'b', 'b']

most_common([n])

返回n個最常見元素及其計數的列表,從最常見到最少排序。

c = Counter('abracadabra')
c.most_common(3)        #輸出:[('a', 5), ('r', 2), ('b', 2)]

subtract([可迭代或對映])

從迭代或從另一個對映(或計數器)中減去元素。輸入和輸出都可以爲零或負數

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:778463939
尋找有志同道合的小夥伴,互幫互助,羣裡還有不錯的視訊學習教學和PDF電子書!
'''
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
print c               輸出:Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

Counter常見用法

c = Counter(a=4, b=2, c=0, d=-2)sum(c.values())                 # 計算value值的和,輸出:4
c.clear()                       # 清除所有鍵值,c的值爲Counter()
list(c)                         # 返回鍵的列表,輸出:['a', 'b', 'c', 'd']
set(c)                          # 返回鍵的集合, 輸出:set(['a', 'b', 'c', 'd'])
dict(c)                         # 返回鍵值對的字典,輸出:{'a': 4, 'b': 2, 'c': 0, 'd': -2}
c.items()                       # 返回鍵值對的元組的列表,輸出:[('a', 4), ('c', 0), ('b', 2), ('d', -2)]Counter(dict([('a',2),('b',3),('c',4)]))    # 返回Counter物件,輸出:Counter({'c': 4, 'b': 3, 'a': 2}c.most_common()[:-n-1:-1]       # 列表切片+c                              #移除值爲0和負數的鍵值對(2.7版本沒有該功能)
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
c + d                       #輸出:Counter({'a': 4, 'b': 3})
c - d                       #輸出:Counter({'a': 2})
c & d                       #相當於min(c[x], d[x]),輸出:Counter({'a': 1, 'b': 1})
c | d                       #相當於max(c[x], d[x]),輸出:Counter({'a': 3, 'b': 2})

deque物件

雙向佇列。

支援以下方法:

append(x)  #將x新增到佇列的右側。

appendleft(x)  #將x新增到佇列的左側。

clear()  #刪除所有元素。

copy()  #佇列的淺複製。版本3.5中的新功能。

count(x)  #計算佇列中元素等於x的數量。版本3.2中的新功能。

extend(iterable)  #將iterable可迭代物件追加到佇列的右側。

extendleft(iterable)  #將iterable物件插入到佇列的左側。注意,迭代物件的元素會反轉順序。

index(x, start, stop)  #返回佇列中第一個x的位置(在start和stop之間)。未找到則引發ValueError。版本3.5中的新功能。

insert(i,x)  #將x插入到佇列的下標爲i的位置。如果插入會導致有界雙端超過maxlen,則會引發IndexError。版本3.5中的新功能。

pop()  #從佇列的右側移除並返回一個元素。如果沒有元素,則引發一個IndexError。

popleft()  #從佇列的左側移除並返回一個元素。如果沒有元素,則引發一個IndexError。

remove(value)  刪除第一次出現的value。如果沒有找到,則引發一個ValueError。

reverse()  #反轉佇列。版本3.2中的新功能。

rotate(n = 1)  #向右旋轉佇列n步。如果n爲負數,則向左旋轉。當雙端佇列不爲空時,向右d.appendleft(d.pop())旋轉一步相當於,向左旋轉一步相當於d.append(d.popleft())。

建立一個雙向佇列

d = deque('ghi')     # 返回一個雙向佇列物件:deque(['g', 'h', 'i'])

defaultdict物件

類字典物件。具有標準dict的操作(還有__missing__和default_factory方法)。

用法:

d = defaultdict(attr) #返回一個新的類字典物件,第一個參數attr提供default_factory的屬性值,預設爲None
'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:778463939
尋找有志同道合的小夥伴,互幫互助,羣裡還有不錯的視訊學習教學和PDF電子書!
'''
#用list作爲default_factory的屬性,類似於dict.setdedault,將一系列鍵值對分組到列表字典中
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)  # 建立一個list屬性的defaultdict物件
for k, v in s:
     d[k].append(v)# d的輸出爲:defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
sorted(d.items())  #輸出:[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]#使用dict.setdefault方法實現:d = {}for k, v in s:  d.setdefault(k, []).append(v)sorted(d.items())  #輸出:[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
#用int作爲default_factory的屬性,對單個元素計數s = 'mississippi'  
d = defaultdict(int)  #建立一個int屬性的defaultdict物件
for k in s:
   d[k] += 1# d的輸出爲:defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})
sorted(d.items())  #輸出:[('i', 4), ('m', 1), ('p', 2), ('s', 4)]
#用set作爲default_factory的屬性,構建集合字典
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
   d[k].add(v)# d的輸出爲:defaultdict(<type 'set'>, {'blue': set([2, 4]), 'red': set([1, 3])})
sorted(d.items())  #輸出:[('blue', {2, 4}), ('red', {1, 3})]

namedtuple物件

可以命名的元組。

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:778463939
尋找有志同道合的小夥伴,互幫互助,羣裡還有不錯的視訊學習教學和PDF電子書!
'''
Point = namedtuple('Point', ['x', 'y'])  #建立一個命名元組
p = Point(11, y=22)     #賦值給元組,輸出:Point(x=11, y=22)
p[0] + p[1]             #元組元素相加,輸出:33
x, y = p                #將元素賦值給x, y,
x, y                    #輸出:(11, 22), 單個x或y輸出爲:11或22p.x + p.y               #元組元素相加,輸出:33

除了繼承元組的方法外,還支援以下三個方法和兩個屬性:

_make():把序列變成命名元組物件

t = [11, 22]
Point._make(t)  #輸出:Point(x=11, y=22)

_asdict():返回一個新的OrderedDict對映鍵值對

p = Point(x=11, y=22)
p._asdict()     #輸出:OrderedDict([('x', 11), ('y', 22)])

_replace(**kwargs):替換命名元組指定鍵的值

p = Point(x=11, y=22)
p._replace(x=33)   #輸出:Point(x=33, y=22)

_fields:返回命名元組的鍵

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:778463939
尋找有志同道合的小夥伴,互幫互助,羣裡還有不錯的視訊學習教學和PDF電子書!
'''
p = Point(x=11, y=22)
p._fields         #輸出:('x', 'y')

Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)
Pixel(11, 22, 128, 255, 0)  #輸出:Pixel(x=11, y=22, red=128, green=255, blue=0)

_fields_defaults:將欄位名稱對映到預設值,返回一個字典

Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
Account._fields_defaults
{'balance': 0}
Account('premium')   #輸出:Account(type='premium', balance=0)

OrderedDict物件

有序字典。按鍵的插入順序排序

d = OrderedDict.fromkeys('abcde')  #建立一個有序字典物件,輸出:OrderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])

除了具有字典dict的方法之外,還有以下兩種方法:

popitem(last=True):刪除並返回鍵值對。如果last爲true,則刪除並返回右端的鍵值對,如果爲false,則刪除並返回左端的鍵值對。

d:   OrderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])
d.popitem(last=True)  #返回('e', None)
d:   OrderedDict([('a', None), ('b', None), ('c', None), ('d', None)])
d.popitem(last=False)  #返回('a', None)
d:   OrderedDict([('b', None), ('c', None), ('d', None)])

move_to_end(key, last=true):將key鍵移動到有序字典的前端或後端。如果last是true(預設),則移動到右端,last爲false,移動到左端

d.move_to_end('b')
s = ''.join(d.keys())   #輸出:'acdeb'
d.move_to_end('b', last=False)
w = ''.join(d.keys())   #輸出:'bacde'