Python辞書のキーが複数の値をマッピングする方法(リストまたはセット)


一つの辞書はキーが単一の値に対応するマッピングです。キーを複数の値にマッピングするには、リストやセットのような他のコンテナにこれらの値を置く必要があります。例えば、次のように辞書を作ることができます。

d = {
 'a' : [1, 2, 3],
 'b' : [4, 5]
}
e = {
 'a' : {1, 2, 3},
 'b' : {4, 5}
}
リストを使うかそれともセットを選ぶかは、あなたの実際の需要によって決まります。要素の挿入順序を維持するにはリストを使うべきです。重複要素を削除するには集合を使います。
このような辞書は、collectionモジュールのdefaultdictを使って作成するのに便利です。defaultdictの特徴は、各keyが対応する値を自動的に初期化していることです。したがって、要素を追加する動作に注意する必要があります。
たとえば:

from collections import defaultdict

d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)

d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
d['b'].add(4)
なお、defaultdictは、アクセスするキー(現在の辞書にはこのようなキーが存在しなくても)のマッピングエンティティを自動的に作成する。このような特性が必要でないなら、普通の辞書でsetdefault()方法を使ってもいいです。たとえば:

d = {} # A regular dictionary
d.setdefault('a', []).append(1)
d.setdefault('a', []).append(2)
d.setdefault('b', []).append(4)
でも、多くのプログラマがset defaultを使うのはちょっと違和感があります。呼び出しごとに新しい初期値のインスタンスを作成する必要があるからです。
討論する
一般的に、多値マッピング辞書を作成するのは簡単です。しかし、あなたが自分を選んで実現すれば、値の初期化はちょっと面倒かもしれません。次のように実現します。

d = {}
for key, value in pairs:
 if key not in d:
  d[key] = []
 d[key].append(value)
defaultdictを使うとコードがもっと簡潔になります。

d = defaultdict(list)
for key, value in pairs:
 d[key].append(value)
以上のPython辞書のキーを複数の値にマッピングする方法(リストまたは集合)は、小編集が皆さんに共有するすべての内容です。参考にしていただければと思います。どうぞよろしくお願いします。