静かなる名辞

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


【python】辞書で複数の値を一つのキーにする

概要

 複数の値を一つのキーにまとめて、結果と対応させたいというケースがあります。

>>> d = {1,2:"hoge", 3,4:"fuga"}  # こんな感じ?

 残念ながらこれはエラーになります。

  File "<stdin>", line 1
    d = {1,2:"hoge", 3,4:"fuga"}
            ^
SyntaxError: invalid syntax

どうすれば良いのか

 基本的にはtupleをキーにします。

>>> d = {(1,2):"hoge", (3,4):"fuga"}
>>> d[(1,2)]
'hoge'

 これで(1,2)というtupleと"hoge"をマッピングできました。

やりたいことはそうじゃなかった

 複数のキーのうち、どれでアクセスしても同じオブジェクトにマッピングされるものがほしい、というケースもあるでしょう。上のtupleを使ったコードはそれを満たしていません。

>>> d[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 1

 しょうがないので、個別にキーに対応する値を登録してやることにします。

>>> s1 = "hoge"
>>> s2 = "fuga"
>>> d = {1:s1, 2:s1, 3:s2, 4:s2}
>>> d[1]
'hoge'
>>> d[2]
'hoge'

 うまく行っている気がする? でも、一つ変更しても他はつられて変わってくれたりはしませんね。

>>> d[1] = "piyo"
>>> d
{1: 'piyo', 2: 'hoge', 3: 'fuga', 4: 'fuga'}

 ポインタ的なものをもう一段追加して、連動して変更できるようにすることも一応可能です。listを使ってやってみます。

>>> l1 = ["hoge"]
>>> l2 = ["fuga"]
>>> d = {1:l1, 2:l1, 3:l2, 4:l2}
>>> d[1][0]
'hoge'
>>> d[1][0] = "piyo"
>>> d
{1: ['piyo'], 2: ['piyo'], 3: ['fuga'], 4: ['fuga']}

 組み込みでこういうことをやってくれるものは探した限りありませんでした。この方法だと面倒くさいというか使い方に注意が要るので、本格的に活用するつもりであれば自作クラスを作ると良いかもしれません。