Pythonで辞書を要素とする配列を特定のキーでソート (Python 2.4の場合)
OpenOfficeをPythonで操ってみたい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 気分。