翻譯:《實用的Python編程》02_05_Collections

目錄 | 上一節 (2.4 序列) | [下一節 (2.6 列表推導式)]()python

2.5 collections 模塊

collections 模塊爲數據處理提供了許多有用的對象。本部分簡要介紹其中的一些特性。git

示例:事物計數

假設要把每隻股票的總份額表格化。github

portfolio = [
    ('GOOG', 100, 490.1),
    ('IBM', 50, 91.1),
    ('CAT', 150, 83.44),
    ('IBM', 100, 45.23),
    ('GOOG', 75, 572.45),
    ('AA', 50, 23.15)
]

此表中有兩個 IBM 條目,兩個 GOOG 條目,它們應該以某種方式合併到一塊兒。segmentfault

計數

解決方案:使用 Counter 模塊。bash

from collections import Counter
total_shares = Counter()
for name, shares, price in portfolio:
    total_shares[name] += shares

total_shares['IBM']     # 150

示例:一對多映射

問題:把一個鍵映射到多個值。app

portfolio = [
    ('GOOG', 100, 490.1),
    ('IBM', 50, 91.1),
    ('CAT', 150, 83.44),
    ('IBM', 100, 45.23),
    ('GOOG', 75, 572.45),
    ('AA', 50, 23.15)
]

像以前的示例那樣,鍵 IBM 應具備兩個不一樣的元組。翻譯

解決方案:使用 defaultdict 模塊。code

from collections import defaultdict
holdings = defaultdict(list)
for name, shares, price in portfolio:
    holdings[name].append((shares, price))
holdings['IBM'] # [ (50, 91.1), (100, 45.23) ]

defaultdict模塊確保每次訪問鍵的時候獲取到一個默認值。對象

示例:保留歷史記錄

問題:咱們須要最近 N 件事的歷史。教程

解決方案:使用 deque 模塊。

from collections import deque

history = deque(maxlen=N)
with open(filename) as f:
    for line in f:
        history.append(line)
        ...

練習

collections 多是最有用的庫模塊之一,用於解決特殊用途的數據處理問題,例如表格化或者索引化。

在本練習中,咱們來看幾個簡單的例子。首先運行report.py ,以便在交互模式下可以加載股票投資組合。

bash % python3 -i report.py

練習 2.18:使用 Counter 模塊表格化

假設須要將每支股票的份額總數表格化,那麼使用 Counter 對象會很容易。試試看:

>>> portfolio = read_portfolio('Data/portfolio.csv')
>>> from collections import Counter
>>> holdings = Counter()
>>> for s in portfolio:
        holdings[s['name']] += s['shares']

>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>>

仔細觀察portfolio 中的 MSFTIBM 的多個條目是如何合併的。

能夠像字典同樣使用 Counter 模塊檢索單個值。

>>> holdings['IBM']
150
>>> holdings['MSFT']
250
>>>

若是想要對值排名,這樣作:

>>> # Get three most held stocks
>>> holdings.most_common(3)
[('MSFT', 250), ('IBM', 150), ('CAT', 150)]
>>>

讓咱們獲取另外一個股票投資組合並生成一個新的 Counter 對象:

>>> portfolio2 = read_portfolio('Data/portfolio2.csv')
>>> holdings2 = Counter()
>>> for s in portfolio2:
          holdings2[s['name']] += s['shares']

>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>>

最後,經過一個簡單的操做把全部的 holdings 變量合併。

>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>> combined = holdings + holdings2
>>> combined
Counter({'MSFT': 275, 'HPQ': 250, 'GE': 220, 'AA': 150, 'IBM': 150, 'CAT': 150})
>>>

這只是對 Counter 功能的一個小嚐試,若是發現須要對值進行表格化,那麼就應該考慮使用它。

說明:collections 模塊

collections 模塊是 Python 全部庫中最有用的庫模塊之一。實際上,咱們能夠爲此作一個拓展教程,可是,如今這樣作會分散注意力。從如今開始,把collections列爲您的睡前讀物,以備後用。

目錄 | 上一節 (2.4 序列) | [下一節 (2.6 列表推導式)]()

注:完整翻譯見 https://github.com/codists/practical-python-zh

相關文章
相關標籤/搜索