【Python】list・tuple・dict の並び替え

投稿日: 2023/12/31
更新日: 2023/12/31
シェア:

URL copied!


概要

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)