静かなる名辞

pythonとプログラミングのこと



【python】辞書で同じキーに複数の値を登録する

 ちょっとしたTips。

 辞書(dict)は通常、一つのキーには一つの値しか登録できない。代入しても上書きされる。

>>> d = {}
>>> d["hoge"] = 1
>>> d
{'hoge': 1}
>>> d["hoge"] = 2
>>> d
{'hoge': 2}

 こういうときどうすれば良いのかというと、値をリスト等にしておいて、そのリストにappendしていけば良い。どのように使いたいかにもよるのだが、大抵はこれで用が済む。

スポンサーリンク


 defaultdictを使うと面倒な初期化処理が省けて便利。

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d["hoge"].append(1)
>>> d["hoge"].append(2)
>>> d
defaultdict(<class 'list'>, {'hoge': [1, 2]})
>>> d["hoge"]
[1, 2]

 別にlistじゃなくても、setだろうがdictだろうが何でも指定できる。tupleも指定はできるが、変更できないと何の役にも立たない。

>>> d = defaultdict(set) # setの場合
>>> d["hoge"].add(1) # setの場合はaddを使う
>>> d["hoge"].add(1)
>>> d["hoge"].add(2)
>>> d["hoge"]
{1, 2} # 重複しないことに注目
>>> d = defaultdict(dict) # dictの場合
>>> d["hoge"][1] = 1
>>> d["hoge"][2] = 2
>>> d["fuga"][-1] = -1
>>> d["fuga"][-2] = -2
>>> d
defaultdict(<class 'dict'>, {'hoge': {1: 1, 2: 2}, 'fuga': {-2: -2, -1: -1}}) # よくわからないけど何でもできそう

 参考:
8.3. collections — コンテナデータ型 — Python 3.6.5 ドキュメント

 mutableなコレクション型を辞書の値にしておく、という発想があればそれほど難しい話ではない。