Pythonでリスト・タプル・文字列の要素をシャッフルする方法(random.shuffle, random.sample)

Pythonのrandomモジュールのshuffle、sample関数について解説します。

Pythonでリスト・タプル・文字列の要素をシャッフルする方法(random.shuffle, random.sample)

Pythonのリスト・タプル・文字列の要素をランダムにシャッフルする方法について解説します。

リスト・タプル・文字列の要素をソート・逆順に並べ替えしたい場合には、以下の記事を参考にしてください。

リストの要素の順番をシャッフルする

Pythonのリストの要素の順番をシャッフルするには、以下の2つの方法があります。

  • 標準ライブラリrandomモジュールのshuffle()を使う方法(元のリストをシャッフルする)
  • 標準ライブラリrandomモジュールのsample()を使う方法(新しいリストを作成する)

ポイントは、新しいリストができるかどうかという点です。

random.shuffle()関数を使う(元のリストをシャッフルする)

Pythonの標準ライブラリであるrandomモジュールには、リストの要素をランダムにシャッフルするshuffle()関数があります。これは元のリストの要素をシャッフルするもので、破壊的処理(元の要素を書き換える処理)になります。

# random.shuffle()関数

import random

# 元のリストの要素の順番がランダムにシャッフルされる
ordered_list = [1, 2, 3, 4, 5]
random.shuffle(ordered_list)
print(ordered_list)
# [5, 3, 1, 4, 2]

random.sample()関数を使う(新しいリストを作成する)

Pythonの標準ライブラリであるrandomモジュールには、指定したリストから、指定した個数の要素をランダムに取得して新しいリストを作成するsample()関数があります。これはrandom.shuffle()関数と違って、元のリストの順序は変えず、新しいリストを作成するため、非破壊的処理(元の要素は書き換えない処理)になります。

sample()関数は、第一引数に要素を取得するリスト、第二引数に取得する要素の個数を指定します。

# random.sample()関数

import random

# 元のリストの要素から二つの要素をランダムに抽出して、
# 新しいリストを作成する
ordered_list = [1, 2, 3, 4, 5]
sampled_list = random.sample(ordered_list, 2)
print(sampled_list)
# [5, 2]

# 元のリストは変わらない
print(ordered_list)
# [1, 2, 3, 4, 5]


# 抽出する要素を元のリストの数と同じにすれば、
# 全体をシャッフルした新しいリストを作成できる
ordered_list = [1, 2, 3, 4, 5]
sampled_list = random.sample(ordered_list, len(ordered_list))
print(sampled_list)
# [3, 2, 1, 4, 5]

タプルの要素をシャッフルする(random.sample)

タプルの要素をシャッフルするには、リストと同様にrandom.sample()関数を使います。

タプルはイミュータブル(変更不可)なオブジェクトなため、random.shuffle()関数のように元のオブジェクト自体に変更を加える関数は適用できません(TypeErrorになる)。

random.sample()関数の戻り値はリスト型になるため、それをtuple()関数でタプルに変換します。

# random.sample()関数でタプルをシャッフルする

import random

# tuple()関数でタプルに戻す
ordered_tuple = (1, 2, 3, 4, 5)
sampled_tuple = tuple(random.sample(ordered_tuple, len(ordered_tuple)))
print(sampled_tuple)
# (5, 2, 4, 1, 3)

# 元のタプルは変わらない
print(ordered_tuple)
# (1, 2, 3, 4, 5)

文字列の要素をシャッフルする(random.sample)

Pythonの文字列もイミュータブル(変更不可)なオブジェクトです。文字列をシャッフルする場合もrandom.sample()関数を使います。

文字列にsample()関数を使うと、一つ一つの文字がランダムに並べ替えられた状態で格納されたリストを返します。それらをjoin()関数で連結して一つの文字列に戻します。

文字列を連結する方法については、以下の記事を参考にしてください。

# random.sample()関数で文字列をシャッフルする

import random

# 文字列にsample関数を使うと、
# シャッフルされた文字のリストを返す
ordered_str = "あいうえお"
sampled_str_list = random.sample(ordered_str, len(ordered_str))
print(sampled_str_list)
# ['う', 'あ', 'え', 'い', 'お']

# リストの要素をjoin関数で文字列として連結する
sampled_str = ''.join(sampled_str_list)
print(sampled_str)
# うあえいお