在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ collections
基礎(chǔ)
itertools
HTTP 服務(wù)
hashlib
閉包
文件和目錄
單元測(cè)試
使用 @property
標(biāo)準(zhǔn)模塊
陌生的 metaclass
Base64
進(jìn)程、線程和協(xié)程
讀寫二進(jìn)制文件
匿名函數(shù)
輸入和輸出
Click
元組
字符編碼
partial 函數(shù)
參考資料
collections
協(xié)程
類和實(shí)例
Python 之旅
定制類和魔法方法
常用數(shù)據(jù)類型
繼承和多態(tài)
ThreadLocal
HTTP 協(xié)議簡(jiǎn)介
Requests 庫的使用
讀寫文本文件
列表
os 模塊
迭代器 (Iterator)
正則表達(dá)式
集合
上下文管理器
異常處理
你不知道的 super
定義函數(shù)
datetime
資源推薦
字典
slots 魔法
hmac
第三方模塊
進(jìn)程
類方法和靜態(tài)方法
函數(shù)參數(shù)
高階函數(shù)
函數(shù)
re 模塊
高級(jí)特性
線程
argparse
生成器
結(jié)束語
字符串
map/reduce/filter
函數(shù)式編程
Celery
裝飾器

collections

我們知道,Python 的數(shù)據(jù)類型有 list, tuple, dict, str 等,collections 模塊提供了額外 5 個(gè)高性能的數(shù)據(jù)類型:

  • Counter: 計(jì)數(shù)器
  • OrderedDict: 有序字典
  • defaultdict: 帶有默認(rèn)值的字典
  • namedtuple: 生成可以通過屬性訪問元素內(nèi)容的 tuple 子類
  • deque: 雙端隊(duì)列,能夠在隊(duì)列兩端添加或刪除元素

Counter

Counter 是一個(gè)簡(jiǎn)單的計(jì)數(shù)器,可用于統(tǒng)計(jì)字符串、列表等的元素個(gè)數(shù)。

看看例子:

>>> from collections import Counter
>>>
>>> s = 'aaaabbbccd'
>>> c = Counter(s)        # 創(chuàng)建了一個(gè) Counter 對(duì)象
>>> c                     
Counter({'a': 4, 'b': 3, 'c': 2, 'd': 1})
>>> isinstance(c, dict)   # c 其實(shí)也是一個(gè)字典對(duì)象
True
>>> c.get('a')
4
>>> c.most_common(2)      # 獲取出現(xiàn)次數(shù)最多的前兩個(gè)元素
[('a', 4), ('b', 3)]

在上面,我們使用 Counter() 創(chuàng)建了一個(gè) Counter 對(duì)象 c,Counter 其實(shí)是 dict 的一個(gè)子類,我們可以使用 get 方法來獲取某個(gè)元素的個(gè)數(shù)。Counter 對(duì)象有一個(gè) most_common 方法,允許我們獲取出現(xiàn)次數(shù)最多的前幾個(gè)元素。

另外,兩個(gè) Counter 對(duì)象還可以做運(yùn)算:

>>> from collections import Counter
>>>
>>> s1 = 'aaaabbbccd'
>>> c1 = Counter(s1)
>>> c1
Counter({'a': 4, 'b': 3, 'c': 2, 'd': 1})
>>>
>>> s2 = 'aaabbef'
>>> c2 = Counter(s2)
>>> c2
Counter({'a': 3, 'b': 2, 'e': 1, 'f': 1})
>>>
>>> c1 + c2       # 兩個(gè)計(jì)數(shù)結(jié)果相加
Counter({'a': 7, 'b': 5, 'c': 2, 'e': 1, 'd': 1, 'f': 1})
>>> c1 - c2       # c2 相對(duì)于 c1 的差集
Counter({'c': 2, 'a': 1, 'b': 1, 'd': 1})
>>> c1 & c2       # c1 和 c2 的交集
Counter({'a': 3, 'b': 2})
>>> c1 | c2       # c1 和 c2 的并集
Counter({'a': 4, 'b': 3, 'c': 2, 'e': 1, 'd': 1, 'f': 1})

OrderedDict

Python 中的 dict 是無序的:

>>> dict([('a', 10), ('b', 20), ('c', 15)])
{'a': 10, 'c': 15, 'b': 20}

有時(shí),我們希望保持 key 的順序,這時(shí)可以用 OrderedDict:

>>> from collections import OrderedDict
>>> OrderedDict([('a', 10), ('b', 20), ('c', 15)])
OrderedDict([('a', 10), ('b', 20), ('c', 15)])

defaultdict

在 Python 中使用 dict 時(shí),如果訪問了不存在的 key,會(huì)拋出 KeyError 異常,因此,在訪問之前,我們經(jīng)常需要對(duì) key 作判斷,比如:

>>> d = dict()
>>> s = 'aaabbc'
>>> for char in s:
...     if char in d:
...         d[char] += 1
...     else:
...         d[char] = 1
...
>>> d
{'a': 3, 'c': 1, 'b': 2}

使用 defaultdict,我們可以給字典中的 key 提供一個(gè)默認(rèn)值。訪問 defaultdict 中的 key,如果 key 存在,就返回 key 對(duì)應(yīng)的 value,如果 key 不存在,就返回默認(rèn)值。

>>> from collections import defaultdict
>>> d = defaultdict(int)   # 默認(rèn)的 value 值是 0
>>> s = 'aaabbc'
>>> for char in s:
...     d[char] += 1
...
>>> d
defaultdict(<type 'int'>, {'a': 3, 'c': 1, 'b': 2})
>>> d.get('a')
3
>>> d['z']
0

使用 defaultdict 時(shí),我們可以傳入一個(gè)工廠方法來指定默認(rèn)值,比如傳入 int,表示默認(rèn)值是 0,傳入 list,表示默認(rèn)是 []

>>> from collections import defaultdict
>>>
>>> d1 = defaultdict(int)
>>> d1['a']
0
>>> d2 = defaultdict(list)
>>> d2['b']
[]
>>> d3 = defaultdict(str)
>>> d3['a']
''

我們還可以自定義默認(rèn)值,通過 lambda 函數(shù)來實(shí)現(xiàn):

>>> from collections import defaultdict
>>>
>>> d = defaultdict(lambda: 10)
>>> d['a']
10

namedtuple

我們經(jīng)常用 tuple (元組) 來表示一個(gè)不可變對(duì)象,比如用一個(gè) (姓名, 學(xué)號(hào), 年齡) 的元組來表示一個(gè)學(xué)生:

>>> stu = ('ethan', '001', 20)
>>> stu[0]
'ethan'

這里使用 tuple 沒什么問題,但可讀性比較差,我們必須清楚索引代表的含義,比如索引 0 表示姓名,索引 1 表示學(xué)號(hào)。如果用類來定義,就可以通過設(shè)置屬性 name, id, age 來表示,但就有些小題大作了。

我們可以通過 namedtuple 為元組的每個(gè)索引設(shè)置名稱,然后通過「屬性名」來訪問:

>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['name', 'id', 'age'])  # 定義了一個(gè) Student 元組
>>>
>>> stu = Student('ethan', '001', 20)
>>> stu.name
'ethan'
>>> stu.id
'001'

deque

deque 是雙端隊(duì)列,允許我們?cè)陉?duì)列兩端添加或刪除元素。

>>> from collections import deque

>>> q = deque(['a', 'b', 'c', 'd'])
>>> q.append('e')         # 添加到尾部
>>> q
deque(['a', 'b', 'c', 'd', 'e'])
>>> q.appendleft('o')     # 添加到頭部
>>> q
deque(['o', 'a', 'b', 'c', 'd', 'e'])
>>> q.pop()               # 從尾部彈出元素
'e'
>>> q
deque(['o', 'a', 'b', 'c', 'd'])
>>> q.popleft()           # 從頭部彈出元素
'o'
>>> q
deque(['a', 'b', 'c', 'd'])
>>> q.extend('ef')        # 在尾部 extend 元素
>>> q
deque(['a', 'b', 'c', 'd', 'e', 'f'])
>>> q.extendleft('uv')    # 在頭部 extend 元素,注意順序
>>> q
deque(['v', 'u', 'a', 'b', 'c', 'd', 'e', 'f'])
>>>
>>> q.rotate(2)           # 將尾部的兩個(gè)元素移動(dòng)到頭部
>>> q
deque(['e', 'f', 'v', 'u', 'a', 'b', 'c', 'd'])
>>> q.rotate(-2)          # 將頭部的兩個(gè)元素移動(dòng)到尾部
>>> q
deque(['v', 'u', 'a', 'b', 'c', 'd', 'e', 'f'])

其中,rotate 方法用于旋轉(zhuǎn),如果旋轉(zhuǎn)參數(shù) n 大于 0,表示將隊(duì)列右端的 n 個(gè)元素移動(dòng)到左端,否則相反。

參考資料

上一篇:hmac下一篇:函數(shù)