1. 程式人生 > >Python之 - --------Collections系列以及用法

Python之 - --------Collections系列以及用法

collections的常用型別有:

計數器(Counter)

雙向佇列(deque)

預設字典(defaultdict)

有序字典(OrderedDict)

可命名元組(namedtuple)

使用以上型別時需要匯入模組 from collections import *

  1. Counter
    Counter 是一個有助於 hashable 物件計數的 dict 子類。它是一個無序的集合,其中 hashable 物件的元素儲存為字典的鍵,它們的計數儲存為字典的值,計數可以為任意整數,包括零和負數。

我們可以這樣檢視 Counter 的幫助資訊,事實上這些資訊來源於 Counter 的文件字串(collections.Counter.doc

)。

此處輸入圖片的描述

此處輸入圖片的描述

下面我們來看一個例子,例子中我們檢視 Python 的 LICENSE 檔案中某些單詞出現的次數。

1.1. Counter 示例

>>> from collections import Counter
>>> import re
>>> path = '/usr/lib/python3.4/LICENSE.txt'
>>> words = re.findall('\w+', open(path).read().lower())
>>> Counter(words).most_common(10)
[('the', 80), ('or', 78), ('1', 66), ('of', 61), ('to', 50), ('and', 48), ('python', 46), ('in', 38), ('license', 37), ('any', 37)]

Counter 物件有一個叫做 elements() 的方法,其返回的序列中,依照計數重複元素相同次數,元素順序是無序的。

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

most_common() 方法返回最常見的元素及其計數,順序為最常見到最少。

>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
  1. defaultdict
    defaultdict 是內建 dict 類的子類,它覆寫了一個方法並添加了一個可寫的例項變數。其餘功能與字典相同。

defaultdict() 第一個引數提供了 default_factory 屬性的初始值,預設值為 None,default_factory 屬性值將作為字典的預設資料型別。所有剩餘的引數與字典的構造方法相同,包括關鍵字引數。

同樣的功能使用 defaultdict 比使用 dict.setdefault 方法快。

defaultdict 用例

>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
dict_items([('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])])

在例子中你可以看到,即使 defaultdict 物件不存在某個鍵,它會自動建立一個空列表。

  1. namedtuple
    命名元組有助於對元組每個位置賦予意義,並且讓我們的程式碼有更好的可讀性和自文件性。你可以在任何使用元組地方使用命名元組。在例子中我們會建立一個命名元組以展示為元組每個位置儲存資訊。
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])  # 定義命名元組
>>> p = Point(10, y=20)  # 建立一個物件
>>> p
Point(x=10, y=20)
>>> p.x + p.y
30
>>> p[0] + p[1]  # 像普通元組那樣訪問元素
30
>>> x, y = p     # 元組拆封
>>> x
10
>>> y
20

總結
這個實驗我們使用了 Collections 中的一些資料結構,可能你目前並用不上他,但希望你以後需要的時候會想起它們 : -)

知識點
Counter 類
defaultdict 類
namedtuple 類
在這個實驗我們會學習 Collections 模組。這個模組實現了一些很好的資料結構,它們能幫助你解決各種實際問題。

>>> import collections

這是如何匯入這個模組,現在我們來看看其中的一些類。

  1. Counter
    Counter 是一個有助於 hashable 物件計數的 dict 子類。它是一個無序的集合,其中 hashable 物件的元素儲存為字典的鍵,它們的計數儲存為字典的值,計數可以為任意整數,包括零和負數。

我們可以這樣檢視 Counter 的幫助資訊,事實上這些資訊來源於 Counter 的文件字串(collections.Counter.doc)。

此處輸入圖片的描述

此處輸入圖片的描述

下面我們來看一個例子,例子中我們檢視 Python 的 LICENSE 檔案中某些單詞出現的次數。

1.1. Counter 示例

>>> from collections import Counter
>>> import re
>>> path = '/usr/lib/python3.4/LICENSE.txt'
>>> words = re.findall('\w+', open(path).read().lower())
>>> Counter(words).most_common(10)
[('the', 80), ('or', 78), ('1', 66), ('of', 61), ('to', 50), ('and', 48), ('python', 46), ('in', 38), ('license', 37), ('any', 37)]

Counter 物件有一個叫做 elements() 的方法,其返回的序列中,依照計數重複元素相同次數,元素順序是無序的。

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

most_common() 方法返回最常見的元素及其計數,順序為最常見到最少。

>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
  1. defaultdict
    defaultdict 是內建 dict 類的子類,它覆寫了一個方法並添加了一個可寫的例項變數。其餘功能與字典相同。

defaultdict() 第一個引數提供了 default_factory 屬性的初始值,預設值為 None,default_factory 屬性值將作為字典的預設資料型別。所有剩餘的引數與字典的構造方法相同,包括關鍵字引數。

同樣的功能使用 defaultdict 比使用 dict.setdefault 方法快。

defaultdict 用例

>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
dict_items([('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])])

在例子中你可以看到,即使 defaultdict 物件不存在某個鍵,它會自動建立一個空列表。

  1. namedtuple
    命名元組有助於對元組每個位置賦予意義,並且讓我們的程式碼有更好的可讀性和自文件性。你可以在任何使用元組地方使用命名元組。在例子中我們會建立一個命名元組以展示為元組每個位置儲存資訊。
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])  # 定義命名元組
>>> p = Point(10, y=20)  # 建立一個物件
>>> p
Point(x=10, y=20)
>>> p.x + p.y
30
>>> p[0] + p[1]  # 像普通元組那樣訪問元素
30
>>> x, y = p     # 元組拆封
>>> x
10
>>> y
20

總結
這個實驗我們使用了 Collections 中的一些資料結構,可能你目前並用不上他,但希望你以後需要的時候會想起它們 : -)