Edited at

[Python] コレクション型をソート

More than 3 years have passed since last update.

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)

公式ページも参考にどうぞ。