読者です 読者をやめる 読者になる 読者になる

Psycho-Logic

Psychology, Programming, and more...?

Python3 DAY8:sort()メソッドについて

今回はリスト内の要素を並び替えるsort()メソッドについて。
 
「入力された値の最大値と最小値を出力」
 
このような処理は誰しも経験があるのではないでしょうか。
方法は様々でしょうが、私が最初に思いつくのは
 
「入力されたものを1つのリストに格納して、リスト内要素を並び替えて最初と最後のインデックスを参照して出力」
 
というものです。
しかし、sort()の返してくる謎の Nonesorted()との違いなど、思わぬところにつまずきました。

 

簡単に言えば 

 
sort()はリストに対して直接要素の並び替えの操作を行うメソッドです。
特徴としては、sort()メソッドを実行した行では None を返します(ここが非常にややこしい)。
対象のリストは次の行から並び替えられたリストとして扱われます。
 
対してsorted()は引数に指定したリストの要素を一時的に並び替える関数です。
「ああ、このリストの要素を並び替えたらこうなるよね」
という具合にテンポラリな処理をするので、実行した行で並び替えたリストを返してくれるイケメンです。
(関数だから「イケファン」かな)
 
ちなみに、どちらの処理も昇順に並び替えを行います。
(降順にしたい場合はreverse()メソッドを組み合わせます。)
これだけではわかりづらいので、コードを見ながら確認していきます。
 

sort()

 
sort()で1番ややこしいのは、並び替えたリストを出力できるまでに None という予期せぬ1拍があることです。
たとえば、a = [3,7,5,1] というリストを昇順に並び替えたい衝動に駆られて
 
a = [3,7,5,1]
print(a.sort())
 
None

 

あるいは、
 
a = [3,7,5,1]
b = a.sort()
print(b)
 
None

(青字は実行結果)

 

と書いて実行すると、どちらも出力結果は None になります。
私は後者の方法でコードを書いていたおかげでエラー地獄にハマりました。

f:id:Mantra:20170222105133j:plain

 
a.sort() を実行した次の行でprint()を実行すると並び替えられたリスト [1,3,5,7] が出力されます。
 
なぜ None なるものがあるのかよくわからないのですが、参考にしたサイトいわく
 
「sorted()と区別するため」
 
らしいです。
(それでも合点は行きませんが…)
私は勝手に「スキルが使えるまでのクールタイム」のようなものだと考えて納得しました。
 

sorted()

 
こちらは前述したように、リストを直接操作するのではなく「並び替えた場合のリスト」を返してくれます。
つまり
 
a = [3,7,5,1]
print(sorted(a))
 
[1,3,5,7]

 

あるいは
 
a = [3,7,5,1]
b = sorted(a)
print(b)
 
[1,3,5,7]

 

 となります。
sort()と違って、どちらの場合もリストaの内容は [3,7,5,1] のままです。
説明不要なくらいにはわかりやすいですね。
 
おそらく、並び替えの関数(あるいはメソッド)といって一般にイメージされるのはsorted()のはずです。
なぜsort()という並び替えから最もイメージしやすい言葉をわかりづらい処理にしたのか、腑に落ちません…。
 

参考サイト

Python 3.6 ドキュメント ソート HOW TO:https://docs.python.jp/3/howto/sorting.html