この記事を読むことによって、Pythonでリストを昇順、降順に並べ替えるsortと、新たにリストを定義して並べ替えるsortedの書き方について違いについて学べます。
また、両者の処理時間を比較することで、timeモジュールをインポートした書き方、処理時間の計算の仕方を学べます。
具体例として、好きなバンドの曲の長さの入ったリストを用います。
カラオケのオハコで、ドロスこと[Alexandros]の中でも特に私がよく歌う曲(現在コロナ禍の為、カラオケは自粛中)をリストにして、sortによる昇順、降順、sortedについてコードを書いて実行していきます。
Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介
今回使用する曲のリストです。
4:08 ワタリドリ
3:15 FamousDay
4:27 RunAway
4:46 SNOW SOUND
これをこの様なリストを作ってみました。
DROS=[‘4:27 RunAway’,’4:08 ワタリドリ’,’3:15 FamousDay’,’4:46 SNOWSOUND’]
単純なコードを書いて、このまま出力してみます。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
print('そのまま出力-->>>>>')
print(DROS)
では、出力結果です。
では、このリストを昇順にします。
カラオケの残り時間があまり無い時には短い曲から歌うことに使えそうですね。
昇順にするにはこの様に書きます。
DROS.sort()
ここまでのコードです。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
print('そのまま出力-->>>>>')
print(DROS)
#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)
辞書を昇順にした実行結果です。
では、降順の出力は、この様に書きます。
DROS.sort(reverse=True)
reverseはデフォルトでは、Falseになっています。
これをTrueにすることによって、リストを降順にしています。
ここまでのコードです。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
print('そのまま出力-->>>>>')
print(DROS)
#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)
#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)
リストを降順にした出力結果です。
これで、この記事を終わりにしても良いのですが、このリスト時間と曲があるので、一層のこと辞書にした方が良いのでは、と思われますよね。
そこで、辞書に作り替えてみます。
この様な辞書を作りました。
dict_DROS={‘4:27′:’RunAway’,’4:08′:’ ワタリドリ’,’3:15′:’FamousDay’,’4:46′:’SNOWSOUND’}
これまでのコードと出力結果です。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
print('そのまま出力-->>>>>')
print(DROS)
#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)
#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)
#辞書を定義
dict_DROS={'4:27':'RunAway','4:08':' ワタリドリ','3:15':'FamousDay','4:46':'SNOWSOUND'}
#辞書をそのまま出力する処理
print('【辞書】を【そのまま】出力-->>>>>')
print(dict_DROS)
辞書をそのまま出力した結果です。
では、同様に辞書を昇順にしてみます。
この書き方はエラーになる
dict_DROS.sort()
このエラー分をざっくりとした日本語に訳すと、「辞書ではsortは使えないよ!!」
という意味です。
つまり、sortはリストでは使えるけれど、辞書では使えないんですよね。
そこで、sortedを使って、items()を加えます。キーと値の両方をタプルとして出力するのに、items()も使って、この様にコードを書き直します。
new_dict_DROS=sorted(dict_DROS.items())
簡単に書くと、並び替えた辞書を新しい辞書に代入して、その新しい辞書を出力しています。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
print('そのまま出力-->>>>>')
print(DROS)
#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)
#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)
#辞書を定義
dict_DROS={'4:27':'RunAway','4:08':' ワタリドリ','3:15':'FamousDay','4:46':'SNOWSOUND'}
#辞書をそのまま出力する処理
print('【辞書】を【そのまま】出力-->>>>>')
print(dict_DROS)
#辞書を昇順にする処理
new_dict_DROS=sorted(dict_DROS.items())
print('【辞書を昇順】に出力-->>>>>')
print(new_dict_DROS)
辞書を昇順にする処理の結果です。
今度は辞書を降順にしてみます。この様にコードを追記します。
こちらもreverseをTrueにします。
new_dict_DROS=sorted(dict_DROS.items(),reverse=True)
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
print('そのまま出力-->>>>>')
print(DROS)
#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)
#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)
#辞書を定義
dict_DROS={'4:27':'RunAway','4:08':' ワタリドリ','3:15':'FamousDay','4:46':'SNOWSOUND'}
#辞書をそのまま出力する処理
print('【辞書】を【そのまま】出力-->>>>>')
print(dict_DROS)
#辞書を昇順にする処理
new_dict_DROS=sorted(dict_DROS.items())
print('【辞書を昇順】に出力-->>>>>')
print(new_dict_DROS)
#辞書を降順にする処理
new_dict_DROS=sorted(dict_DROS.items(),reverse=True)
print('【辞書を降順】に出力-->>>>>')
print(new_dict_DROS)
辞書を降順にする出力結果です。
sortedはリストでも辞書でも使えるんなら、sortっていらなくね?
って思いましたので、なぜsortが存在するのか処理時間の観点から見てみます。
一旦分かりやすくする為に、リストの定義と昇順のコードのみを掲載します。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)
このコードに追記して、sortを使った場合とsortedを使った場合の処理時間の違いを求めます。
timeモジュールをインポートして、sortの処理の直前にこの様に書くと処理開始前の時刻が求められます。
startTime1=time.time()
このコードで処理開始前の時刻が求められます。
この時刻とは、1970年1月1日0時0分0秒からの経過秒数です。
その為、処理の直後にはにendTime1を同様に記述して、下記の様にstartTime1とendTime1の差を求めることによって、処理にかかる時間を求めることが出来ます。
Time1=endTime1-startTime1
sortedの場合は、startTime2とendTime2の差を同様にしてを求めます。
また、どっちの方がどれだけ時間が短かったのかをIF文での分岐で比較を使って求めたので、ちょっとコードが長くなりました。
#時間を計測する為、にtimeモジュールをインポート
import time
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
#【sort】を使って昇順にするのにかかる時間を求める
#処理の開始
startTime1=time.time()
#【昇順】にする処理
DROS.sort()
#処理の終了
endTime1=time.time()
#【sort】の処理時間
Time1=endTime1-startTime1
#処理時間の出力
print('【sort】を使ってリストを昇順にした時の処理時間')
print(Time1)
#【sorted】を使って昇順にするのにかかる時間を求める
#処理の開始
startTime2=time.time()
#【昇順】にする処理
newList=sorted(DROS)
#処理の終了
endTime2=time.time()
#【sorted】の処理時間
Time2=endTime2-startTime2
#処理時間の出力
print('【sorted】を使ってリストを昇順にした時の処理時間')
print(Time2)
#【sort】と【sorted】の処理時間でどちらの方が時間がかかるか比較する
#sortの方が早い場合
if Time1<Time2:
print('【sort】の方が'+str(Time2-Time1)+'処理が早い\n')
#sortedの方が早い場合
else:
print('【sorted】の方が'+str(Time1-Time2)+'処理が早い\n')
では、測定結果です。
これだけ見ると、sortの方が処理速度的にお得に思えます。
しかし、何回かやっていると時間が変わるので、その画面も表示します。
【sorted】の方が早いこともある。
こうなると、リストの並べ替えでsortedではなく、sortを使うメリットは処理速度以外に何かあるのか考えてみました。
リストをループで表示してみます。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
#ループでそのまま改行表示
print('リストをループで【そのまま】表示')
for music in DROS:
print(music)
これを【sort】と【sorted】でループ表示してみます。
#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']
#ループでそのまま改行表示
print('リストをループで【そのまま】表示')
for music in DROS:
print(music)
print()
#sortを使ってループで表示
print('リストをループで【sort】で表示')
DROS.sort()
for music in DROS:
print(music)
print()
#sortedを使ってループで表示
print('リストをループで【sorted】で表示')
DROS=sorted(DROS)
for music in DROS:
print(music)
なので、結局、リストの場合sortを使うメリットというものがこの記事の実験からは明確にはなりませんでした。
まとめるとsortとsortedの違いはsortはリストのみ、sortedはリストだけではなく辞書も使えます。
sortとsortedの処理時間を検証したところ、若干sortの方が私の環境では早いようです。
ドロスこと[Alexandros]の車のCMソング「風になって」が話題ですね。
私もこの曲大好きで、コロナが終息したらカラオケに行って歌いたいです。
当分は自粛、自粛、自粛ですが。
ベストアルバム『Where’s My History?』も発売されますね。
楽しみです。
iTunesで買おうかな(=^・^=)mm。。。
では、そのまま出力、ループで出力、時間の昇順に出力、時間の降順に出力でプログラミングして見ます。
最後までお読みいただき、ありがとうございます。
■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。
Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。