HOWTO · Python

Python で複数の値を持つ辞書

このチュートリアルでは、Python で辞書のキーに複数の値を追加する方法を示します

このページの内容

Python の辞書では、各キーに1つの値が対応します。その値にリストを使えば、1つのキーに複数の項目を関連付け、データが増えるたびに項目を追加できます。

たとえば、次の例では "a" に対応する値は [1, 2] というリストです。

d = {"a": [1, 2], "b": [2, 3], "c": [4, 5]}
print(d)

この方法は、同じキーが繰り返し現れるデータをまとめたり、関連する複数の値を一緒に保持したりするときに便利です。以下では、再利用できるヘルパー関数、defaultdict、setdefault() を使う方法を紹介します。

ユーザー定義関数を使って辞書のキーに複数の値を追加する

ヘルパー関数を使うと、キーが初めて現れたときにリストを用意し、その後は extend() でイテラブルの各項目を既存のリストに追加できます。この関数は渡された辞書を変更して返します。受け取ったリストを入れ子の項目として保存するわけではありません。

次の例を実行します。

def add_values(mapping, key, values):
    if key not in mapping:
        mapping[key] = []
    mapping[key].extend(values)
    return mapping


word_freq = {"tutorial": [2, 3, 5]}
add_values(word_freq, "tutorial", [20, 21, 22])
print(word_freq)

名前を付けた処理としてまとめたい場合や、同じ初期化処理を複数の場所で使いたい場合に、この方法が役立ちます。リストなどのイテラブルを extend() に渡すと、その各項目が追加先のリストに加わります。

defaultdict を使って辞書のキーに複数の値を追加する

collections から defaultdict をインポートし、デフォルトファクトリーに list を指定します。存在しないキーを参照すると、新しいリストが作成されて辞書に格納されます。そのため、同じキーを含むペアをまとめるのに便利です。通常の辞書で存在しないキーを参照すると KeyError が発生します。defaultdict でもすべての操作でこれを避けられるわけではなく、ファクトリーが使われるのは d[key] による参照であり、get() などのメソッドでは使われません。

次の例では、各値を対応するキーの下にまとめます。

from collections import defaultdict

pairs = [("rome", 1), ("paris", 2), ("newyork", 3), ("paris", 4), ("delhi", 1)]
grouped = defaultdict(list)
for key, value in pairs:
    grouped[key].append(value)

print(dict(grouped))

キーと値のペアを含むイテラブルから辞書を作る場合に、この方法を使えます。表示前に dict に変換すると、defaultdict 型の表示を含めずに、まとめたデータを確認できます。

setdefault() メソッドを使って辞書の特定のキーに複数の値を追加する

setdefault() は、キーにすでに格納されている値を返します。キーが存在しない場合は、指定したデフォルト値を挿入して返します。デフォルト引数を省略すると、その値は None になります。この例では空のリストを指定しているため、返された値に append() を使えます。

pairs = [("rome", 1), ("paris", 2), ("newyork", 3), ("paris", 4), ("delhi", 1)]
data = {}
for key, value in pairs:
    data.setdefault(key, []).append(value)

print(data)

各入力ペアから1つずつ項目を追加する簡潔なループには、setdefault() が便利です。初期化がより複雑な場合や同じ処理を繰り返し使う場合は、ヘルパー関数や defaultdict を使うと意図を保ちやすくなります。