原文:『実用的なPythonプログラミング』02_05_Collections
4698 ワード
目次|前のセクション(2.4シーケンス)|[次節(2.6リスト導出式)]()
2.5 collectionsモジュール
例:物事の数
各株の総シェアを表化すると仮定します.
この表には2つの
カウント
ソリューション:
例:1対のマルチマッピング
質問:1つのキーを複数の値にマッピングします.
前の例のように、キー
ソリューション:
例:履歴の保持
質問:私たちは最近のN件の歴史が必要です.
ソリューション:
練習する
本練習では、いくつかの簡単な例を見てみましょう.まず、
練習2.18:Counterモジュールを使用して表化する
1株当たりのシェア総数を表化する必要があると仮定すると、
Counterモジュールを使用して、辞書のように単一の値を取得できます.
値をランキングしたい場合は、次のようにします.
別の株式投資グループを取得し、新しいCounterオブジェクトを生成します.
最後に、すべてのholdings変数を簡単な操作でマージします.
これはCounter機能の小さな試みにすぎず,値を表化する必要があることが分かった場合,それを使用することを考慮すべきである.
説明:collectionsモジュール
目次|前のセクション(2.4シーケンス)|[次節(2.6リスト導出式)]()
注:完全な翻訳はhttps://github.com/codists/practical-python-zhを参照
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})
>>>
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のすべてのライブラリで最も有用なライブラリモジュールの1つです.実際には、このために拡張チュートリアルを行うことができますが、今は注意力を分散させます.これからは、collections
を寝る前の読み物にして、後用に備えます.目次|前のセクション(2.4シーケンス)|[次節(2.6リスト導出式)]()
注:完全な翻訳はhttps://github.com/codists/practical-python-zhを参照