LoginSignup
59
71

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-02

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)

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

59
71
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
71