目錄 | 上一節 (2.4 序列) | 下一節 (2.6 列表推導式)html
collections
模塊爲數據處理提供了許多有用的對象。本部分簡要介紹其中的一些特性。python
假設要把每隻股票的總份額表格化。git
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
條目,它們應該以某種方式合併到一塊兒。github
解決方案:使用 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
模塊確保每次訪問鍵的時候獲取到一個默認值。htm
問題:咱們須要最近 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
假設須要將每支股票的份額總數表格化,那麼使用 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
模塊是 Python 全部庫中最有用的庫模塊之一。實際上,咱們能夠爲此作一個拓展教程,可是,如今這樣作會分散注意力。從如今開始,把collections
列爲您的睡前讀物,以備後用。