サイトアイコン Python Snippets

リスト(list), 辞書(dict), setのソート(sorted)

リストをソートするにはsorted関数を使用する。
sorted関数は、ソートしたリストを返す関数で、元になるリストは変更されない(immutable)。

一方リストにはsortメソッドがあり、リスト自体をソートする操作(mutable)もあるので注意。

>>> l = [3, 2, 5, 4, 1]
>>> sorted(l)
>>> [1, 2, 3, 4, 5]
>>> l
[3, 2, 5, 4, 1]

sorted関数は辞書(dict)のキーのソートやsetのソートにも使える。

>>> d = {'c': 10, 'b':1, 'a':30}
>>> sorted(d)   #ソートされたキーのリストを返す
['a', 'b', 'c']

>>> d = set([3,1,2])
>>> d
set([1, 2, 3])
>>> sorted(d)
[1, 2, 3]

sorted関数のreverseをTrueにすれば逆順ソート。

>>> l = [3, 2, 5, 4, 1]
>>> sorted(l, reverse=True)
[5, 4, 3, 2, 1]

sorted関数のkeyを指定することで、任意の条件でソートすることができる。

key関数が返す値でソートされる。以下の例はHogeオブジェクトのname属性を返す関数を指定したことで、name属性でソートしている。

>>> class Hoge:
...   def __init__(self, i, name):
...     self.i = i
...     self.name = name
...   def __repr__(self):
...     return "%d:%s" % (self.i, self.name)
...
>>> l2 = [Hoge(2, 'c'), Hoge(3, 'a'), Hoge(1, 'b')]
>>> l2
[2:c, 3:a, 1:b]
>>> sorted(l2, key=lambda h: h.name) #name属性を返す
[3:a, 1:b, 2:c]

上の例では、name属性を返す関数をlambda式で指定したが、特定の属性を返す関数は、operatorモジュールのattrgetter関数を使えば簡単に作成できる。

>>> import operator
>>> l2 = [Hoge(2, 'c'), Hoge(3, 'a'), Hoge(1, 'b')]
>>> sorted(l2, key=operator.attrgetter('name'))
[3:a, 1:b, 2:c]
関連記事:

モバイルバージョンを終了