Pythonで辞書を要素とする配列を特定のキーでソート (Python 2.4の場合)

OpenOfficePythonで操ってみたいbonlifeです。誰か参考URLを沢山紹介してください!

■[開発] Pythonで辞書を要素とする配列を特定のキーでソート

探したけど見つからなかった。

初めてのlambda。

piro_sukeさんのやり方より、もうちょっとだけナイスなやり方があります。Python 2.4から、sort や sorted に key を指定できるようになりました。これを使えば、引数2個使ったり、cmp とか書かずに済みます。
ということで、サンプルです。

In [1]: ranking_list = []

In [2]: ranking_list.append({"uriage": 30, "shiire": 5, "zairyo": 20 })

In [3]: ranking_list.append({"uriage": 20, "shiire": 10, "zairyo": 10 })

In [4]: ranking_list.append({"uriage": 10, "shiire": 15, "zairyo": 30 })

In [5]: sorted(ranking_list,key=lambda a: a.get('zairyo'), reverse=True)
Out[5]:
[{'shiire': 15, 'uriage': 10, 'zairyo': 30},
 {'shiire': 5, 'uriage': 30, 'zairyo': 20},
 {'shiire': 10, 'uriage': 20, 'zairyo': 10}]

In [6]: sorted(ranking_list,key=lambda a: a.get('shiire'))
Out[6]:
[{'shiire': 5, 'uriage': 30, 'zairyo': 20},
 {'shiire': 10, 'uriage': 20, 'zairyo': 10},
 {'shiire': 15, 'uriage': 10, 'zairyo': 30}]

だいたいこんな感じです。
ってコメントで同じこと指摘してる人がいましたよ…orz。仕方がないので、もう少しだけ補足しておくことにします。(自分用メモです。)
複数の要素の昇順、降順を組み合わせてソートするサンプルです。

In [1]: sample_list = []

In [2]: sample_list.append({'a':30,'b':20,'c':10})

In [3]: sample_list.append({'a':10,'b':10,'c':10})

In [4]: sample_list.append({'a':10,'b':20,'c':30})

In [5]: sample_list
Out[5]:
[{'a': 30, 'b': 20, 'c': 10},
 {'a': 10, 'b': 10, 'c': 10},
 {'a': 10, 'b': 20, 'c': 30}]

In [6]: sorted(sample_list, key=lambda x: (-x.get('c')))
Out[6]:
[{'a': 10, 'b': 20, 'c': 30},
 {'a': 30, 'b': 20, 'c': 10},
 {'a': 10, 'b': 10, 'c': 10}]

In [7]: sorted(sample_list, key=lambda x: (-x.get('c'),x.get('a')))
Out[7]:
[{'a': 10, 'b': 20, 'c': 30},
 {'a': 10, 'b': 10, 'c': 10},
 {'a': 30, 'b': 20, 'c': 10}]

In [8]: sorted(sample_list, key=lambda x: (x.get('b'),-x.get('c')))
Out[8]:
[{'a': 10, 'b': 10, 'c': 10},
 {'a': 10, 'b': 20, 'c': 30},
 {'a': 30, 'b': 20, 'c': 10}]
  • In [6] は c の降順
  • In [7] は c の降順、a の昇順
  • In [8] は b の昇順、c の降順

結構便利。SQL の ORDER BY っぽい雰囲気ですね。マイナス付けると DESC 気分。