Pythonのコレクション型をソートする方法についてまとめる。
リスト
まず1つ目は、リストのsortメソッドを使う方法。
sortメソッドは返り値をとらず、もとのリストを書き換える。
デフォルトでは昇順にソートされる。
>>> a = [8, 1, 5, 3, 6]
>>> a.sort()
>>> a
[1, 3, 5, 6, 8]
降順にソートしたい場合は引数のreverseキーワードをTrueにする。
>>> a = [8, 1, 5, 3, 6]
>>> a.sort(reverse=True)
>>> a
[8, 6, 5, 3, 1]
2つ目は、sorted関数を使う方法。
sorted関数はソート済みのリストを返す。
>>> a = [8, 1, 5, 3, 6]
>>> sorted(a)
[1, 3, 5, 6, 8]
sorted関数でもreverseキーワードをTrueにすると降順にソートできる。
>>> a = [8, 1, 5, 3, 6]
>>> sorted(a, reverse=True)
[8, 6, 5, 3, 1]
辞書
Pythonの辞書は順番が保証されないのでソートはできない。
sorted関数の引数に辞書を渡すとキーのみのソート済みリストが返される。
>>> b = {'Matsui': 55, 'Ichiroh': 51, 'Kuroda': 18}
>>> sorted(b)
['Ichiroh', 'Kuroda', 'Matsui']
itemsメソッドを使うとリストにタプルが入れ子になって返ってくる。
このとき、keyでソートされている。
>>> b = {'Matsui': 55, 'Ichiroh': 51, 'Kuroda': 18}
>>> sorted( b.items() )
[('Ichiroh', 51), ('Kuroda', 18), ('Matsui', 55)]
valueでソートしたい場合は、keyパラメータとlambda関数を用いる。
>>> b = {'Matsui': 55, 'Ichiroh': 51, 'Kuroda': 18}
>>> sorted(b.items(), key=lambda x:x[1])
[('Kuroda', 18), ('Ichiroh', 51), ('Matsui', 55)]
構造を維持したままソートしたいときは、OrderedDictを用いる。 ※ @shiracamus さんのご指摘により追加・修正。
>>> b = {'Matsui': 55, 'Ichiroh': 51, 'Kuroda': 18}
>>> b
{'Ichiroh': 51, 'Matsui': 55, 'Kuroda': 18}
>>> from collections import OrderedDict
>>> c = OrderedDict(sorted(b.items(), key=lambda x:x[1]))
>>> c
OrderedDict([('Kuroda', 18), ('Ichiroh', 51), ('Matsui', 55)])
>>> c.values()
[18, 51, 55]
>>> c.keys()
['Kuroda', 'Ichiroh', 'Matsui']
タプル
タプルは不変性オブジェクトなので厳密にはソートはできないが、sorted関数とtuple関数を使うことで実現できる。
>>> d = (8, 1, 5, 3, 6)
>>> tuple( sorted(d) )
(1, 3, 5, 6, 8)
公式ページも参考にどうぞ。