Pythonでリストの要素をシャッフル(random.shuffle, sample)

Modified: | Tags: Python, リスト

Pythonでリストの要素をシャッフル(ランダムに並べ替え)するには、標準ライブラリのrandomモジュールを使う。

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

ランダムではなく昇順や降順にソートしたり逆順に並べ替えたい場合は以下の記事を参照。

元のリストをシャッフル: random.shuffle()

random.shuffle()は元のリストをランダムに並び替える(破壊的処理)。

import random

l = [0, 1, 2, 3, 4]

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

シャッフルされた新たなリストを生成: random.sample()

random.sample()は、リストからランダムに要素を選択し新たなリストを返す。元のリストは変更されない(非破壊的処理)。

第一引数にリスト、第二引数に選択する要素の個数を指定する。詳細は以下の記事を参照。

random.sample()で選択する要素の個数をリストの全要素数とすれば、全要素がランダムに並び替えられた新たなリストが得られる。リストの全要素数はlen()で取得できる。

import random

l = [0, 1, 2, 3, 4]

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

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

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

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

import random

s = 'abcde'

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

t = (0, 1, 2, 3, 4)

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

文字列やタプルをシャッフルしたい場合は新たなオブジェクトを生成するrandom.sample()を使う。引数に文字列やタプルを指定した場合もrandom.sample()はリストを返すので、文字列やタプルに戻すための処理が必要。

文字列の場合は一文字ずつのリストとなる。再度ひとつの文字列に連結するにはjoin()メソッドを使う。

s_shuffled = ''.join(random.sample(s, len(s)))
print(s_shuffled)
# aedcb

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

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

なお、上の例はあくまでも文字列自体のシャッフルで、文字列を要素とするリストはrandom.sample()でもrandom.shuffle()でもシャッフル可能。

l = ['apple', 'banana', 'cherry', 'date']

l_shuffled = random.sample(l, len(l))
print(l_shuffled)
# ['cherry', 'banana', 'apple', 'date']

random.shuffle(l)
print(l)
# ['date', 'apple', 'cherry', 'banana']

乱数シードを固定

random.seed()に任意の整数を与えることで、乱数シードを固定し乱数生成器を初期化できる。

同じシードで初期化した後は同じように並び替えられる。

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

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

関連カテゴリー

関連記事