Python独習!

習得したPython知識をペイフォワード

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']
/* -----codeの行番号----- */