Python講座 / 辞書でキーと値を管理する
辞書はキーを使って値を検索するデータ構造です。名前付きの項目やカテゴリ別集計に使えますが、キーがないことをエラーにするのか、初期値で扱うのかを明示して選びます。
キーの条件と値の置き換えを理解する
波かっこの中へkey: valueの組を記述します。既存キーへ代入すると値を置き換え、同じキーの項目をもう一つ追加するのではありません。キーはハッシュ可能である必要があり、文字列や整数は一般的な例ですが、リストは使えません。
expense = {"name": "lunch", "amount": 8000}
expense["amount"] = 9000
print(expense["amount"])
金額は9000になります。文字列キーの大文字小文字や前後の空白は区別されます。辞書は挿入順を保持しますが、名前や値の順で自動的に整列するわけではありません。必要な表示順は明示して指定します。
オブジェクト共有とキー別集計は、変数のスコープ・別名・可変オブジェクトを理解するとcollectionsとitertoolsで集計・反復するで扱う規則とつながります。
カテゴリ別の合計を作る
dicts.pyへ全体コードを保存し、仮想環境でpython dicts.pyを実行します。カテゴリが最初に出たときは0から加算し、すでに出た場合は前の合計へ追加します。
expenses = [("food", 8000), ("transport", 2500), ("food", 3500)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
for category, total in sorted(totals.items()):
print(category, total)
print(totals.get("books", 0))
予想結果です。
food 11500 transport 2500 0
必須項目と初期値を使い分ける
totals["books"]はキーがなければKeyErrorになります。totals.get("books", 0)は0を返しますが、そのキーを辞書へ追加しません。集計の初回には初期値が便利でも、必須の入力項目が欠けた場合に使うと、不正なデータを隠すおそれがあります。
辞書自身の反復ではキー、values()では値、items()ではキーと値の組を取り出します。辞書のコピーも通常は浅いため、値に入れたリストなどが元と共有される点に注意します。
正規化と辞書の変更を試す
foodの3500を4500へ変えると、foodだけが12500になります。foodの一つをFoodへ変えると別グループになります。必要なら統一の規則を決めますが、識別上の意味を失わないか確認してください。
booksが必須カテゴリなら、存在を確認する処理を別に書き、単に0で済ませません。同じ辞書を反復中にキーを追加・削除するとRuntimeErrorになることがあります。変更対象のキーを先に集めるか、新しい辞書を組み立てます。便利な初期値に、欠損データの妥当性の判断まで任せないことが大切です。
ハッシュ可能なオブジェクトは、生存中に変わらないハッシュ値を持ち、等しいと比較される値同士で同じハッシュ値を返します。dictのキーとsetの要素にはこの条件が必要です。リストは使えず、リストを含むタプルもハッシュ可能ではありません。未登録のキーを0から集計する処理が繰り返される場合はdefaultdict(int)を検討できます。
動作と適用条件の公式説明:Python glossary: hashable




