LoginSignup
1
3

More than 5 years have passed since last update.

【Python入門】list sortでリストの中身を効率的にソートする方法

Posted at

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト:【Python入門】list sortでリストの中身を効率的にソートする方法

【Python入門】list sortでリストの中身を効率的にソートする方法

プログラミングをしていると、リストの中身をソートしたい場面が出てきます。言語によってはfor文などを駆使して、既存のソートアルゴリズムを実現する、というやり方のものがあり、意外と大変です。しかし、Pythonならリストをソートするための関数が用意されているため、簡単にソートすることができます。

今回は、リストの中身をソートする方法を説明します。

目次
1 sort関数を使ったソート
2 reverse関数を使った逆順ソート
3 sorted関数を使ったソート
   3.1 sorted関数で昇順ソート
   3.2 sorted関数で降順ソート
4 多次元リストのソート

sort関数を使ったソート

Pythonでリストをするためのもっとも簡単な方法はsort関数を使うことです。sort関数の構文は以下のようになります。

リスト.sort()

sort()を使うと、リストの中身が昇順でソートされます。文字列は文字コード順、数値は小さい順にソートされます。sort()でソートした場合は、元のリストの中身が入れ替わります。

list1 = ['python', 'list', 'sort']
print('ソート前:{}'.format(list1))

list1.sort()
print('ソート後:{}'.format(list1))

実行結果

ソート前:[‘python’, ‘list’, ‘sort’]
ソート後:[‘list’, ‘python’, ‘sort’]

reverse関数を使った逆順ソート

sort関数を使えば、リストを簡単にソートできますが、順番が必ず昇順になります。降順でソートしたいときはreverse関数を使いましょう。reverse関数の構文は以下の通りです。

リスト.reverse()

reverse()を使うと、リストの中身がすべて逆順になります。そのため、sort()を使って昇順にソートした後にreverse()を使うことで、リストを降順にソートすることができます。

list1 = [1,5,3,9,6,7,8]
print('ソート前:{}'.format(list1))

list1.sort()
print('ソート後(昇順):{}'.format(list1))

list1.reverse()
print('ソート後(降順):{}'.format(list1))

実行結果

ソート前:[1, 5, 3, 9, 6, 7, 8]
ソート後(昇順):[1, 3, 5, 6, 7, 8, 9]
ソート後(降順):[9, 8, 7, 6, 5, 3, 1]

sorted関数を使ったソート

sort関数でリストを昇順ソート、さらにreverse関数を使うことで降順ソートが実現できることが分かりました。しかし、この2つの関数を使ったソートの場合は、元のリストの中身が書き換えられます。

ソートをしたけど元に戻しておきたい場合などを考えると、できれば中身は変えずにソート済みのリストを新しく別に作成したい、という場合あります。そんな時はsorted関数が便利です。

sorted関数で昇順ソート

sorted関数は、sort関数と同様にリストをソートする関数です。しかし、sorted関数はソートされたリストを返すので、sort関数とは違って元のソートの中身は変わりません。sorted関数で昇順ソートを行う構文は以下のようになります。

リスト2 = sorted(リスト1)

ソートする前のリスト1をsortedに渡すことで、ソートされたリストが返されます。それをリスト2に代入することで、リスト1をソートした新しいリスト2が作られます。元のリストは変更されないので、もしもの時に備えて元のリストをのこしておけるのはいいですね。

list1 = [1,5,3,9,6,7,8]
list2 = sorted(list1)

print('ソート前:{}'.format(list1))
print('ソート後:{}'.format(list2))

実行結果

ソート前:[1, 5, 3, 9, 6, 7, 8]
ソート後:[1, 3, 5, 6, 7, 8, 9]

sorted関数で降順ソート

sorted関数でソートを行うと昇順になりますが、当然降順にソートすることもできます。

リスト2 = sorted(リスト1)

sorted関数を使う際に、reverseというオプションをTrueにすることで、降順にソートすることができます。

list1 = [1,5,3,9,6,7,8]
list2 = sorted(list1, reverse=True)  #reverseをTrueに

print('ソート前:{}'.format(list1))
print('ソート後:{}'.format(list2))

実行結果

ソート前:[1, 5, 3, 9, 6, 7, 8]
ソート後:[9, 8, 7, 6, 5, 3, 1]
多次元リストのソート

ここまで1次元のリストのソートの方法を説明してきましたが、時には2次元以上の多次元リストをソートしたい場合があると思います。多次元の配列でも1次元と同様にsort(), reverse(), sorted()を使えばソートできます。

しかし、多次元の場合はどの値をキーにしてソートしたかによって結果が変わります。例えば、以下のようなリストをソートするとします。

list1 = [[1,5,3], [6,4,8], [9,11,2]]

このlist1は3個の要素を持つリストが3つ集まった2次元配列です。このlist1は、要素となっている各リストの何番目の要素をキーにするかでソートの結果が変わります。

[[1, 5, 3], [6 ,4 ,8], [9, 11, 2]]  #各リストの1番目の要素をキー
[[6, 4, 8], [1, 5, 3], [9, 11, 2]]  #各リストの2番目の要素をキー
[[9, 11, 2], [1, 5, 3], [6, 4, 8]]  #各リストの3番目の要素をキー

多次元リストを普通にソートすると1番目の要素をキーにしてソートされます。キーにする要素を指定してソートするには、itemgetterを使用します。

from operator import itemgetter

リスト1.sort(key=itemgetter(1)) #リスト1は2次元以の配列

itemgetterはoperatorライブラリの関数なので、最初にインポートする必要があります。itemgetter()の引数は、キーにしたい要素の番号を表します。itemgetter(1)の場合は1番目の要素をキーにしてリストをソートします。

itemgetterを使うことで、どの要素をキーにするかを選択することができます。

from operator import itemgetter

list1 = [[1,5,3], [6,4,8], [9,11,2]]
print('ソート前:{}'.format(list1))

list1.sort(key=itemgetter(0))
print('ソート後(0番目の要素):{}'.format(list1))

list1.sort(key=itemgetter(1))
print('ソート後(1番目の要素):{}'.format(list1))

list1.sort(key=itemgetter(2))
print('ソート後(2番目の要素):{}'.format(list1))

実行結果

ソート前:[[1, 5, 3], [6, 4, 8], [9, 11, 2]]
ソート後(0番目の要素):[[1, 5, 3], [6, 4, 8], [9, 11, 2]]
ソート後(1番目の要素):[[6, 4, 8], [1, 5, 3], [9, 11, 2]]
ソート後(2番目の要素):[[9, 11, 2], [1, 5, 3], [6, 4, 8]]

1
3
0

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
1
3