Python で辞書をソートしようとすると、
>>> h = {'a' : 200, 'b' : 300, 'c' : 500, 'd' : 100, 'e' : 400} >>> for k, v in sorted(h): ... print k, v ... Traceback (most recent call last): File "", line 1, in ValueError: need more than 1 value to unpack
エラーになった。これは、sorted(h)
がキーしか返さないからだ。
>>> for k in sorted(h): ... print k ... a b c d e
キーと値がほしいときにはこうする。
>>> for k, v in sorted(h.items()): ... print k, v ... a 200 b 300 c 500 d 100 e 400
辞書の items メソッドは、キーと値からなるタプルのリストを返してくれる。
>>> h.items() [('a', 200), ('c', 500), ('b', 300), ('e', 400), ('d', 100)]
で、そのタプルの第1要素でソートされる。つまり辞書のキーでソートされるわけだ。
でも、今日やりたいのは値でソートすること。そのためには、sorted に key 引数を渡してやればいい。具体的にはこうする。
>>> for k, v in sorted(h.items(), key=lambda x: x[1]): ... print k, v ... d 100 a 200 b 300 e 400 c 500
key 引数に渡しているのは、タプルの第2要素を返す関数だ。つまりこの関数の返り値でソートされるわけだな。
ちなみに、降順にするには、reverse=True
を渡してやる。
>>> for k, v in sorted(h.items(), key=lambda x: x[1], reverse=True): ... print k, v ... c 500 e 400 b 300 a 200 d 100