Pythonメモ1 -sort()の注意点-


Pythonを学習する中で、特にこれは注意すべきだと思ったポイントを、「Pythonメモ」というテーマでQiitaに記事を上げていこうと思います。
今回は、sort()について整理していきます。

1.sort()とは

2.sort()とsorted()の違い

3.sort()、sorted()を使う上での注意点

4.出典

1. sort()とは

そもそも、sortは日本語でどういう意味なのでしょうか。

sort(名)種類、人、もの
sort(動)分類する、区分する

(出典) sortの意味・使い方・読み方 | Weblio英和辞書

Pythonのsort()は、動詞の意味である「分類する、区分する」という意味から転じて、リストの要素の順番を並べ替える役割を持ちます。並べ替え方は、アルファベットのみの要素の場合はアルファベット順数値のみの要素の場合は昇順に並べ替えます。
以下のコードに、その例を示します。

アルファベットのリストの場合
name = ["Sato", "Suzuki", "Ito", "Tanaka"]
name.sort()
print(name)

#出力結果
["Ito", "Sato", "Suzuki", "Tanaka"]
数値のリストの場合
numbers = [20, 10.9, 39, 3.2]
numbers.sort()
print(numbers)

#出力結果
[3.2, 10.9, 20, 39]

上記のように、sort()を使うことでアルファベットのリスト要素はアルファベット順に、数字のリストの要素は昇順に並べ替えることができます。
ちなみに、数字のリストがfloat型とint型で混合していますが、その場合でもsort()は全ての要素を昇順に並べ替えてくれます。

2. sort()とsorted()の違い

先ほどは、sort()の説明をしました。しかし、sort()以外にsorted()というものがあり、sort()とは少しだけ機能が異なります。
sort()がリスト自体を並べ替えるのに対し、sorted()はリストを並べ替えたものをコピーしてその値を返すのです。
その違いを、実際にコードで見てみましょう。

sorted()の使い方
name = ["Mai", "Hanako", "Taro", "Emi"]
sorted_name = sorted(name)
print(sorted_name)

#出力結果
["Emi", "Hanako", "Mai", "Taro"]

print(name)

#出力結果
["Mai", "Hanako", "Taro", "Emi"]

まず、sort()との違いとして呼び出し方が違うことが分かります。sort()の場合が、リスト名.sort()出逢ったのに対し、sorted()の場合はsorted(リスト名)です。また、先ほど説明したようにsort()はリスト自体を並べ替えるので、出力する時はprint(リスト名)とするのに対し、sorted()はリスト自体を並べ替えるわけではなくそのコピーを返すので、上記のコードのように一度変数に代入してから出力する必要があります。
コードの最後に、sort()とsorted()の違いを分かりやすく示しました。sorted()の場合は、リスト名を出力したら並び替える前のリストが出力されるのです。

3. sort()、sorted()を使う上での注意点

ここまでsort()とsorted()の使い方と違いを見てきました。最後に、両方に共通する注意点を見ていきます。

これまでのリストは全て、アルファベットのみもしくは数値のみのリストでした。なので、試しにアルファベットと数値の混合のリストを用意し、sort()とsorted()を使ってみましょう。

アルファベットと数値の混合のリスト
#sorted()の場合
various = [3, "Heren", 4, "Kiyoshi"] 
sorted_various = sorted(various)

#出力結果
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'

#sort()の場合
various_2 = [30, "Asei", "Kohsei", 2]
various_2.sort()

#出力結果
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'

上記をご覧の通り、sort()、sorted()共に同じエラーが出てしまいました。TypeErrorを簡単に和訳してみると、「str型とint型のインスタンスの間では「<」がサポートされていません」となります。つまり、同じ数値であるint型とfloat型においては、大きさを比較して並べ替えることができますが、str型の要素とint型とfloat型はそもそも比較のしようがないということです。

したがって、リストをsort()やsorted()で並べ替えたい場合は、リストの要素がアルファベットなどの文字と数値で混合していないかどうかに気を付けましょう。

4. 出典

Bill Lubanovic著 斎藤 康毅 監訳 長尾 高弘 訳  『入門Python3』
出版社:オライリー・ジャパン ISBN 978-4-87311-738-6