Pythonでリストの要素をランダムソート(シャッフル)

Pythonでリスト(配列)の要素をランダムソート(シャッフル)したい場合、標準ライブラリのrandomモジュールを使います。

9.6. random — 擬似乱数を生成する — Python 3.6.3 ドキュメント

元のリストをランダムに並び替える関数shuffle()と、ランダムに並び替えられた新たなリストを返す関数sample()があります。sample()は文字列やタプルに対しても使えます。

元のリストをランダムソート(シャッフル): random.shuffle() ランダムソート(シャッフル)された新たなリストを生成: random.sample() 文字列やタプルのシャッフル 乱数シードを固定

ランダムではなく昇順や降順にソートしたり逆順に並べ替えたい場合は

元のリストをランダムソート(シャッフル): random.shuffle()

randomモジュールの関数shuffle()で、元のリストをランダムに並び替えられます。

import random

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

random.shuffle(l)
print(l)
# [4, 3, 2, 1, 0]

ランダムソート(シャッフル)された新たなリストを生成: random.sample()

randomモジュールの関数sample()を使うと、元のリストは変更せず、ランダムに並び替えられた新たなリストを作成することができます。 sample()はリストからランダムに要素を選択し取得する関数。第一引数にリスト、第二引数に取得したい要素の個数を指定します。詳細は

sample()で選択する要素の個数をリストの全要素数とすれば、全要素がランダムに並び替えられた新たなリストが得られます。リストの全要素数はlen()で取得します。 元のオブジェクトは変更されません。

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

lr = random.sample(l, len(l))
print(lr)
# [3, 2, 4, 1, 0]

print(l)
# [0, 1, 2, 3, 4]

文字列やタプルのシャッフル

文字列やタプルはイミュータブル(変更不可)なので、元のオブジェクトを変更するrandom.shuffle()を使うとエラーTypeErrorになります。

s = 'abcde'

# random.shuffle(s)
# TypeError: 'str' object does not support item assignment

t = tuple(range(5))
print(t)
# (0, 1, 2, 3, 4)

# random.shuffle(t)
# TypeError: 'tuple' object does not support item assignment

文字列やタプルをシャッフルしたい場合は新たなオブジェクトを生成するrandom.sample()を使います。 引数に文字列やタプルを指定した場合もrandom.sample()はリストを返すので、文字列やタプルに戻すための処理が必要。 文字列の場合は一文字ずつのリストとなります。再度ひとつの文字列に連結するにはjoin()メソッドを使います。

sr = ''.join(random.sample(s, len(s)))
print(sr)
# caebd

タプルの場合はリストからタプルを生成するtuple()を使います。

tr = tuple(random.sample(t, len(l)))
print(tr)
# (2, 1, 4, 3, 0)

乱数シードを固定

randomモジュールの関数seed()に任意の整数を与えることで、乱数シードを固定することができます。常に同じように並び替えられます。

random.seed(0)
l = list(range(5))
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]
Last Updated: 6/26/2019, 10:34:03 PM