PYTHON MEBY

Pythonでリストをシャッフル(random.shuffle)

この記事では、Pythonの標準ライブラリ`random`モジュールにある`shuffle()`関数を使用してリストをシャッフルする方法を説明します。様々な例題を通して、その使用方法と注意点について解説します。

目次

random.shuffle()関数の基本

Pythonでリストをランダムに並べ替えるには、`random.shuffle()`関数を使用します。この関数は、リストの要素をインプレースでシャッフルします。つまり、元のリストの内容が変更されます。

import random
my_list = [1, 2, 3, 4, 5]
random.shuffle(my_list)
print(my_list)

上記コードを実行すると、`my_list`の要素の順番がランダムに変化します。出力されるリストは実行するたびに異なります。

シャッフルの仕組み

`random.shuffle()`関数は、Fisher-Yatesシャッフルアルゴリズム(またはKnuthシャッフル)と呼ばれる効率的なアルゴリズムを使用してリストをシャッフルします。このアルゴリズムは、リストの要素をランダムに選択し、リストの最後に移動させることで、すべての可能な順列を均等な確率で生成します。

詳細は、Fisher-Yatesシャッフルアルゴリズムについて検索してみてください。

サンプルコード:数値リストのシャッフル

import random
my_list = list(range(10))
random.shuffle(my_list)
print(my_list)

0から9までの数値を持つリストをシャッフルします。出力されるリストは毎回異なります。

サンプルコード:文字列リストのシャッフル

import random
my_list = ['apple', 'banana', 'cherry', 'date']
random.shuffle(my_list)
print(my_list)

文字列リストをシャッフルします。出力されるリストは毎回異なります。

注意点:in-place操作であること

`random.shuffle()`関数は、リストを直接変更します(in-place操作)。元のリストを保持したい場合は、リストをコピーしてからシャッフルする必要があります。

import random
original_list = [1, 2, 3, 4, 5]
shuffled_list = original_list.copy()
random.shuffle(shuffled_list)
print(f'元のリスト: {original_list}')
print(f'シャッフル後のリスト: {shuffled_list}')

補足:シャッフルされたリストを新しいリストとして取得する方法

元のリストを変更せずに、シャッフルされた新しいリストを取得したい場合は、`copy()`メソッドを使ってリストをコピーしてからシャッフルするか、`random.sample()`関数を使用します。

import random
my_list = [1, 2, 3, 4, 5]
# copy()メソッド使用
shuffled_list_copy = my_list.copy()
random.shuffle(shuffled_list_copy)
print(f'copy()を使ったシャッフル: {shuffled_list_copy}')
# random.sample()関数使用
shuffled_list_sample = random.sample(my_list, len(my_list))
print(f'random.sample()を使ったシャッフル: {shuffled_list_sample}')

関連記事