翻譯:《實用的Python編程》02_05_Collections
目錄 | 上一節 (2.4 序列) | 下一節 (2.6 列表推導式)
2.5 collections 模塊
collections 模塊為數據處理提供了許多有用的對象。本部分簡要介紹其中的一些特性。
示例:事物計數
假設要把每只股票的總份額表格化。
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 條目,它們應該以某種方式合并到一起。
計數
解決方案:使用 Counter 模塊。
from collections import Counter
total_shares = Counter()
for name, shares, price in portfolio:
total_shares[name] += shares
total_shares['IBM'] # 150
示例:一對多映射
問題:把一個鍵映射到多個值。
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 模塊。
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 中的 MSFT 和 IBM 的多個條目是如何合并的。
可以像字典一樣使用 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列為您的睡前讀物,以備后用。
浙公網安備 33010602011771號