Pythonでlistをソートする

listをソートしたいときに、sortsortedだったか迷うときありますよね?

公式ドキュメントに明記されています。

この記事では、実際にコードを書いて説明します。

sortとsorted

sort

sortはオブジェクトそのものがソートされます。
idを見ると、ソート前とソート後のオブジェクトが同じことを確認できます。

l = [5, 3, 1, 4, 2]
print(l)
print(id(l))

# [5, 3, 1, 4, 2]
# 2376540581376

ls = l.sort()
print(ls)
print(id(ls))

# None
# 140708468534488

print(l)
print(id(l))

# [1, 2, 3, 4, 5]
# 2376540581376

sorted

sortedはソートされた新たなオブジェクトを生み出します。
ソート対象のオブジェクト自体はソートされず、そのままです。

l = [5, 3, 1, 4, 2]
print(l)
print(id(l))

# [5, 3, 1, 4, 2]
# 2376543782400

ls = sorted(l)
print(ls)
print(id(ls))

# [1, 2, 3, 4, 5]
# 2376540581376

print(l)
print(id(l))

# [5, 3, 1, 4, 2]
# 2376543782400

昇順・降順

昇順・降順はreverseで指定します。
デフォルトはreverse=Falseで、昇順がデフォルトとなります。

sortもsortedも昇順・降順指定はreverseなのでsortでサンプルコードを書きます。

数値のソート

# 数値のソート
l = [5, 3, 1, 4, 2]
print(l)

# [5, 3, 1, 4, 2]

# 降順でソートする。
l.sort(reverse=True)
print(l)

# [5, 4, 3, 2, 1]

# 昇順でソートする。
l.sort(reverse=False)
print(l)

# [1, 2, 3, 4, 5]

文字列のソート

# 文字列のソート
l = ['desk', 'chair', 'light']
print(l)

# ['desk', 'chair', 'light']

# 降順でソートする。
l.sort(reverse=True)
print(l)

# ['light', 'desk', 'chair']

# 昇順でソートする。
l.sort(reverse=False)
print(l)

# ['chair', 'desk', 'light']

時刻のソート

# 時刻のソート
now = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
t1 = now - timedelta(days=1)
t2 = now + timedelta(days=1)
t3 = now

l = [t1, t2, t3]
print(l)

# [datetime.datetime(2024, 9, 1, 0, 0), datetime.datetime(2024, 9, 3, 0, 0), datetime.datetime(2024, 9, 2, 0, 0)]

# 降順でソートする。
l.sort(reverse=True)
print(l)

# [datetime.datetime(2024, 9, 3, 0, 0), datetime.datetime(2024, 9, 2, 0, 0), datetime.datetime(2024, 9, 1, 0, 0)]

# 昇順でソートする。
l.sort(reverse=False)
print(l)

# [datetime.datetime(2024, 9, 1, 0, 0), datetime.datetime(2024, 9, 2, 0, 0), datetime.datetime(2024, 9, 3, 0, 0)]