#sortとsortedの違い
初めまして。
これからエンジニアを目指す19歳です。
今回は、練習問題を解いている時にふと疑問に思ったので、備忘録として
sortとsortedの違い
について記していこうと思います。どなたかの解決の一助になれば幸いです。 初心者なので見づらいと思いますが、ご容赦下さい。以下の順で書いていきたいと思います。
ー sortメソッドとは何か、またどう使うのか ー sorted関数とは何か、またどう使うのか ー どこが違うのか###sortメソッドとは何か、またどう使うのか
TechAcademyマガジンによるとsortメソッドについて、以下のように書かれていました。
『sort関数とは、リストの並び替えを行うための関数です。数値や文字列のリストを昇順もしくは降順に並び替えることができます。』
また使い方については、
『sort関数は、「リスト名.sort()」という形で使うことができます。また、reverseという引数を任意で設定することもできます。reverseはデフォルトではFalseになっているので、reverseを特に設定せずに使うと昇順になります。reverse=Trueとすると降順にできます。』
実際にはsortメソッドらしいなのですが、まあ細かいことは置いておいて。
上記の内容によると、sortメソッドは『リスト』の要素の順序変更を操作するメソッドで、例えば
>>>str_list = list("qiita")
>>>str_list.sort()
>>>print(str_list)
['a', 'i', 'i', 'q', 't']
や
>>>str_list = list("qiita")
>>>str_list.sort(reverse=True)
>>>print(str_list)
['t', 'q', 'i', 'i', 'a']
と言うようにすればよいらしいです。
###sorted関数とは何か、またどう使うのか
dot blogによると
『sorted関数はPythonの組み込み関数の1つでリストやタプル、辞書、セット、文字列といった複数の要素を持つオブジェクト内の要素をソート(並び替え)し新たなリストで返す関数』
と記されており、例えば
>>>x = (5, 8, 4, 1, 3, 2, 7, 6)
>>>y = sorted(x, reverse=True)
>>>print(y)
と入力しても
[8, 7, 6, 5, 4, 3, 2, 1]
と出力されるようです。タプル化する為には
>>>x = (5, 8, 4, 1, 3, 2, 7, 6)
>>>y = tuple(sorted(x, reverse=True))
>>>print(y)
とすればタプル化されて出力さるようです。
また辞書にsorted関数を使用をすると
>>>sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
[1, 2, 3, 4, 5]
辞書の要素がリスト化されて出力されるらしいです。
###どこが違うのか
さてここまでの内容でほとんど答えは出ているので、まとめ的な形で記そうと思います。
・sortメソッドはリストにのみ適用可能で、元のリストをそのまま利用して並び替えを行う。
・一方、sorted関数はイテラブルなものに対して有効であり、並び替えをした後は新たなリストに要素を入れる。
と言うような違いがありました。
ここからは余談になりますが、
sortメソッドやsorted関数には、引数にkey=関数と指定すると、
その関数の値を比較基準にして、並び替えを実施するらしいです。
例えば、Python3.9ドキュメントによると、
大文字小文字を区別しない文字列比較の例:
>>>sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
他にも
>>>student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
>>>sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
上記のような使い方もできるようです。
(捕捉)
key=関数名とすると、最初にイテラブルオブジェクトの各要素に対してその関数の機能を実施し、その後並び替えを行なっているそうです。
例えば、上記の二つの例で言うと、
前者では最初にリスト化した文字列の各要素を全て小文字に置き換えた後、並び替えを行なっているそうです。(しかし、出力の際には元の要素に戻っている。)
なので、大小関係なく並び替えが実施されるようです。
続いて、後者ではラムダ式を用いているのですなわち、
>>>def ~~(student):
return student[2]
と言うことになり、この無名関数の実引数に上記のリストの各要素(すなわち上記のタプル)が代入され、そのインデックス番号が2の値が返り値として返されたのち、それを比較対象として並び替えを行う。
ここで一つ疑問に思ったこと。
『仮に上記のインデックス番号が、同値なら次に比較されるものはなんなのか。』
どなたかご教授願えますでしょうか。
ふう。初めて書きましたが、時間と体力を使いますね。
また次回、気になったことがあったら書いていきたいと思います。
誤り等がございましたら、ご指摘のほどよろしくお願いします。
最後まで長い長い旅に付き合っていただきありがとうございました。
次回もよろしくお願いします。