Pythonのlist.sort()とsorted(list)の違いは新たにリストが作られるかどうか
- list.sort()とsorted(list)の使い分けは?
- 対象となるリストを作り替えてもいい場合は list.sort() を、対象となるリストを残しておきたい場合は sorted(list) を使う
解説
list.sort()
sortメソッドは対象リストに直接変更を加えるソートを行う。これを「インプレイスでソートする」と言う。以下コード内の#1と#2が示すように、ソート前後でオブジェクトIDが変わっていないことがわかる。
data = ["Green", "Blue", "Red", "Yellow", "Orange", "Brown", "Black"] print("Object ID:", id(data)) #1 data.sort() print("Result :", data) print("Object ID:", id(data)) #2
Object ID: 86722536 #1 Result : ['Black', 'Blue', 'Brown', 'Green', 'Orange', 'Red', 'Yellow'] Object ID: 86722536 #2
sorted(list)
sorted関数は対象リストとは別の新しいリストを作り、ソートした要素を入れる。以下コード内の#3と#4が示すように、sort関数から返ってくるとオブジェクトIDが変わっていることからも分かる。
data = ["Green", "Blue", "Red", "Yellow", "Orange", "Brown", "Black"] print("Object ID:", id(data)) #3 print("Result :", sorted(data)) print("Object ID:", id(sorted(data))) #4
Object ID: 86722504 #3 Result : ['Black', 'Blue', 'Brown', 'Green', 'Orange', 'Red', 'Yellow'] Object ID: 86721800 #4
Tips ~Pythonのソートは安定している~
『安定』とは、ソート基準が同等のデータはソート前の順番が保持される、ということを意味する。細かいことだが、これを知らないとkeyパラメータに複数条件を入れる…なんて無駄なことをやってしまいかねない。と思ったら、過去に挙げた記事でまんまそれをやってしまっていた。
greenhornprofessional.hatenablog.com
文字数でソートする例
Green, Brown, Blackは5文字なので、同等データとなるがちゃんとソート前の順序が保持されていることがわかる。
data = ["Green", "Blue", "Red", "Yellow", "Orange", "Brown", "Black"] data.sort(key=len) print(data)
['Red', 'Blue', 'Green', 'Brown', 'Black', 'Yellow', 'Orange']