【Python】list・tuple・dict の並び替え
更新日: 2023/12/31
概要
Python で並び替えのやり方の覚書。
list を並び替え
sort()
元のリスト自体を書き換える。
※ sort()
実行時には返却値がないので注意
※ 元の入力値はなくなってしまうので、入力値を使用する場合は次の sorted()
を用いるか、あらかじめ別の変数に保存しておかなければならない。
数字の場合(昇順)
val1 = [4, 2, 3, 1]
val1.sort()
print(val1)
# [1, 2, 3, 4]
数字の場合(降順)
val1 = [4, 2, 3, 1]
val1.sort(reverse=True)
print(val1)
[4, 3, 2, 1]
文字の場合
val2 = ['x', 'a', 'b', 'ab', 'c']
val2.sort() # A
print(val2)
# ['a', 'ab', 'b', 'c', 'x']
sorted
引数に指定したリストを並べ替える。
引数に指定したリストは変化しない。
数字の場合
val1 = [4, 2, 3, 1]
print(sorted(val1))
# [1, 2, 3, 4]
print(val1)
# [4, 2, 3, 1]
# 降順
print(sorted(val1, reverse=True))
# [4, 3, 2, 1]
文字の場合
val2 = ['x', 'a', 'b', 'ab', 'c']
print(sorted(val2))
# ['a', 'ab', 'b', 'c', 'x']
print(val2)
# ['x', 'a', 'b', 'ab', 'c']
# 降順
print(sorted(val2, reverse=True))
# ['x', 'c', 'b', 'ab', 'a']
tuple を並び替え
tuple を直接並べ替える方法はない
リストに変換
tuple には sort()
がないので
val3 = (4, 2, 3, 1)
val3.sort()
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# AttributeError: 'tuple' object has no attribute 'sort'
リストに変換してから sort()
する。
val3 = (4, 2, 3, 1)
val3_list = list(val3)
val3_list.sort()
print(val3_list)
# [1, 2, 3, 4]
print(tuple(val3_list)) # タプルに戻すなら
# (1, 2, 3, 4)
sorted を使う
tuple でも sorted を使うことは可能。
ただし 返却値はリストになる
ので注意。
tuple に戻すならキャストする必要がある。
val3 = (4, 2, 3, 1)
print(sorted(val3)) # list型になる
# [1, 2, 3, 4]
print(tuple(sorted(val3))) # tuple型に戻すなら
# (1, 2, 3, 4)
Dict を並び替え
Python 3.7 以降、通常の dict でも挿入された順序を保持するようになったため、for で回す際などで順序を入れ替えたくなる場面も多いと思います。
そのまま sorted を使うと key だけになってしまいます。
my_dict = {1:100, 5:500, 2:200}
sorted(my_dict)
# [1, 2, 5]
items() を用いることで可能です。 (キャストは必要)
sorted(my_dict.items())
# [(1, 100), (2, 200), (5, 500)]
dict(sorted(my_dict.items()))
# {1: 100, 2: 200, 5: 500}
キーで並べ替える
dict(sorted(my_dict.items()))
# 降順
dict(sorted(my_dict.items(), reverse=True))
値で並べ替える
dict(sorted(my_dict.items(), key=lambda item: item[1]))
# 降順
dict(sorted(my_dict.items(), key=lambda item: item[1], reverse=True))
番外編: OrderedDict
挿入順序を保持する dict としては OrderedDict があります。
並び替えに関しては dict と変わりませんが以下の特徴があります。
※ 使用するには import が必要です。
from collections import OrderedDict
move_to_end(key, last=True)
指定した key を辞書の最後に移動させる。
last=False を設定すると、指定した key を辞書の最初に移動させる。
返り値はなし。
# 最後に移動
print(my_dict2)
# OrderedDict([(1, 100), (5, 500), (2, 200)])
my_dict2.move_to_end(5)
print(my_dict2)
# OrderedDict([(1, 100), (2, 200), (5, 500)])
# 最初に移動
print(my_dict2)
# OrderedDict([(1, 100), (5, 500), (2, 200)])
my_dict2.move_to_end(5, last=False)
print(my_dict2)
# OrderedDict([(5, 500), (1, 100), (2, 200)])
popitem(last=True)
最後に挿入された要素を辞書から削除して、削除したものを返す。
last=False にすると、最初に挿入された要素を削除して、削除したものを返す。
my_dict = {1:100, 5:500, 2:200}
my_dict2 = OrderedDict(my_dict)
# 最後を削除
my_dict2.popitem()
# (2, 200)
print(my_dict2)
# OrderedDict([(1, 100), (5, 500)])
# 最初を削除
my_dict2.popitem(last=False)
# (1, 100)