こんにちは、ナナです。
リスト要素には様々な情報が並びます。それらの要素を並び替えしたいというニーズも時には出てくるでしょう。
リストオブジェクトには、要素を並び替えるメソッドが用意されています。
本記事では次の疑問点を解消する内容となっています。
では、リストの並び替えについて学んでいきましょう。
リストを逆順に並べ替える
師匠!リストの中身を逆順に並べ替えしたいんですよ。何か方法はないんですか?
リストには並べ替えの方法が用意されていますので、それを紹介しましょうね。
reverseメソッドによる並べ替え
「reverse」とは「逆」という意味です。その名の通り、逆順に並べ替えるためのメソッドになります。
num_list = [0, 10, 20, 30, 40]
# リストを逆順に入れ替え
num_list.reverse()
print(num_list)
[40, 30, 20, 10, 0]
結果からわかる通り、リスト要素が逆順になっていますね。
このメソッドは、リストオブジェクトを複製せず、メソッドを実施したリスト要素を入れ替えることに注意しましょう。
元のリスト内容を残しておきたいのであれば、一度「copyメソッド」などで複製してから「reverseメソッド」で並べ替えましょう!
スライスによる並び替え
スライスを使うことで、逆から順に要素を取り出す方法もあります。
スライスの「間隔」に「-1」を指定することで逆順に要素を並べ替えることができます。
num_list1 = [0, 10, 20, 30, 40]
# スライスによる逆順への並べ替え
num_list2 = num_list1[::-1]
print(num_list1)
print(num_list2)
[0, 10, 20, 30, 40]
[40, 30, 20, 10, 0]
スライスの場合は、リストオブジェクトを生成するため、元のリストには影響がありません。
リストの昇順・降順の並び替え(ソート)
師匠!リストの要素を追加・削除していたら、順番がはちゃめちゃになってしまいました・・・。
綺麗に並ばせたいのです。バブルソートやらを行うしかないんですか?並べ替えのロジックって難しくて毎回忘れちゃいます。
Pythonのリストには昇順・降順に並べ替えるメソッドが用意されているんですよ。だから、自分でソートプログラムを作らなくても並べ替えができますよ。
「ソート」とはデータを昇順や降順に並び替えることを言います。
ソートアルゴリズムというものは「バブルソート」をはじめ様々あるのですが、Pythonのリストには、標準でソートを実施するメソッドが用意されています。
sortメソッドでデータを昇順に並べ替える
次のようにリスト要素の中に、順番がばらばらの数字が並んでいたとしましょう。sortメソッドを実施すると並び替えが発生します。
num_list1 = [50, 30, 10, 20, 40]
# ソートによる昇順並び替え
num_list1.sort()
print(num_list1)
[10, 20, 30, 40, 50]
綺麗に昇順に並んでいますね。
sortメソッドでデータを降順に並べ替える
続いてリストを降順に並べてみましょう。
sort関数には、「reverse」という引数が存在します。reverseをTrueに指定することで「降順」を示すことになります。
num_list1 = [50, 30, 10, 20, 40]
# ソートによる降順並び替え
num_list1.sort(reverse=True)
print(num_list1)
[50, 40, 30, 20, 10]
結果は無事に降順になりました。
sort関数も対象のリストオブジェクトを直接並べ替えることに注意しましょう。
このようにPythonには標準でソートができる仕組みが用意されています。この辺りのサポート体制が、初心者にもやさしいプログラミング言語になっていますね。
sorted関数を使った昇順・降順の並び替え
sortメソッドはリストオブジェクトの中身を直接並び替えしましたが、sorted関数を使うと別のリストオブジェクトを生成してくれます。
list1 = [50, 30, 10, 20, 40]
# sorted関数による昇順並び替え
list2 = sorted(list1)
print("list1:", list1)
print("list2:", list2)
list1: [50, 30, 10, 20, 40]
list2: [10, 20, 30, 40, 50]
「sorted関数」はメソッドではなくprint関数と同じ「組み込み関数」というものです。
逆順に並べ替える場合も、sortメソッドと同様にreverse引数をTrueにすることで可能です。
list1 = [50, 30, 10, 20, 40]
# sorted関数による降順並び替え
list2 = sorted(list1, reverse=True)
print("list1:", list1)
print("list2:", list2)
list1: [50, 30, 10, 20, 40]
list2: [50, 40, 30, 20, 10]
sorted関数は「オブジェクト.関数名()」という形で呼び出さないためメソッドではありません。そのため、文字列といったオブジェクトを引数で指定することもできます。
string1 = "HelloWorld"
# 文字列の並び替え
string2 = sorted(string1)
# 文字列の表示
print(string1)
print(string2)
HelloWorld
['H', 'W', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r']
このように文字列はひとつひとつの文字がリスト要素に分解され、ソートされてリストオブジェクトとして生成されます。
英大文字と英小文字は大文字の方がアスキーコードの値として小さいため、先に並んでいますね。
アスキーコードについて知りたい方は、C言語の記事ですが『C言語 文字と文字列を図解【何が違うのこの2つ?解決します】』を読むとよいでしょう。
文字列の昇順・降順の並べ替え
ここまでは数値でしたが、文字列のリストも並べ替えることができます。
week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
# ソートによる昇順並び替え
week.sort()
print(week)
# ソートによる降順並び替え
week.sort(reverse=True)
print(week)
['Friday', 'Monday', 'Saturday', 'Sunday', 'Thursday', 'Tuesday', 'Wednesday']
['Wednesday', 'Tuesday', 'Thursday', 'Sunday', 'Saturday', 'Monday', 'Friday']
このように、アルファベットの場合は先頭の文字によって昇順・降順で並べ替えが実施できます。
Q&A:Pythonのリストの並べ替えに関するよくある質問
リストの並べ替えについて質問ある人はどうぞ!
Q:リストに数値や文字が混在していた場合はソートするとどうなるの?
師匠!リストの中って「数値」も「文字列」もごっちゃに入れられるじゃないですか。そんなリストはソートすると、どうなっちゃうんですか?
ソートっていうのはやっぱり基準があって入れ替えができるんです。だから、「数値」や「文字列」が混在したリストは並べ替えができません。
それはしょうがないんですよ。
次のように、「数値」や「文字列」が一緒になったリストを作ることは可能です。しかし、ソートを行うとなるとできないんですね。
mix = [50, "Hello", 3.14]
# ソートによる昇順並び替え
mix.sort()
File "C:/PythonProject/project1/main.py", line 4, in <module>
mix.sort()
TypeError: '<' not supported between instances of 'str' and 'int'
このようにstr型とint型における比較はできないとのエラーが発生しましたね。