note.nkmk.me

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

Date: 2018-01-21 / Modified: 2018-06-04 / tags: Python, リスト

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

元のリストをランダムに並び替える関数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]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事