概要
複数の値を一つのキーにまとめて、結果と対応させたいというケースがあります。
>>> 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']}
組み込みでこういうことをやってくれるものは探した限りありませんでした。この方法だと面倒くさいというか使い方に注意が要るので、本格的に活用するつもりであれば自作クラスを作ると良いかもしれません。