原文:『実用的なPythonプログラミング』02_05_Collections

4698 ワード

目次|前のセクション(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)
]

この表には2つのIBMエントリ、2つのGOOGエントリがあり、それらは何らかの方法で統合されるべきです.
カウント
ソリューション:Counterモジュールを使用します.
from collections import Counter
total_shares = Counter()
for name, shares, price in portfolio:
    total_shares[name] += shares

total_shares['IBM']     # 150

例:1対のマルチマッピング
質問:1つのキーを複数の値にマッピングします.
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は2つの異なる要素群を有しなければならない.
ソリューション: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は、表化またはインデックス化などの特殊な用途のデータ処理の問題を解決するために最も有用なライブラリモジュールの1つである可能性がある.
本練習では、いくつかの簡単な例を見てみましょう.まず、report.pyを実行して、インタラクティブモードで株式ポートフォリオをロードできるようにします.
bash % python3 -i report.py

練習2.18:Counterモジュールを使用して表化する
1株当たりのシェア総数を表化する必要があると仮定すると、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})
>>>
portfolioMSFTIBMの複数のエントリがどのように結合されているかをよく観察します.
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のすべてのライブラリで最も有用なライブラリモジュールの1つです.実際には、このために拡張チュートリアルを行うことができますが、今は注意力を分散させます.これからは、collectionsを寝る前の読み物にして、後用に備えます.
目次|前のセクション(2.4シーケンス)|[次節(2.6リスト導出式)]()
注:完全な翻訳はhttps://github.com/codists/practical-python-zhを参照