Pythonのリストをシャッフルする方法を解説!初心者向けにrandom.shuffleの使い方をやさしく説明
生徒
「Pythonで、リストの中身をランダムな順番にしたいときってどうすればいいんですか?」
先生
「そのときはrandom.shuffleという関数を使います。これはリストの中の要素をシャッフル、つまり順番をバラバラにしてくれる便利な機能なんですよ。」
生徒
「じゃんけんの順番や、カードをまぜるようなときにも使えそうですね!」
先生
「その通りです!実際にどう使うか、一緒に見ていきましょう。」
1. Pythonのリストをシャッフルする方法(random.shuffle)
Pythonでリストの要素をバラバラの順序に並び替えたいときは、標準ライブラリのrandomモジュールに含まれるshuffle(シャッフル)という関数を使うのが最も一般的で簡単です。
トランプのカードを混ぜるように、既存のリストの中身をランダムに入れ替えることができます。プログラミング未経験の方でも、以下の短いコードを書くだけで実行可能です。
import random
# シャッフルしたいデータのリストを作成
numbers = [1, 2, 3, 4, 5]
# random.shuffleを使ってリストの中身を混ぜる
random.shuffle(numbers)
# 結果を表示
print(numbers)
このプログラムを実行するたびに、結果は以下のように変わります。
[4, 2, 5, 1, 3]
ここで初心者が覚えておきたい重要なポイントは、random.shuffle(numbers)を実行した瞬間に、変数「numbers」の中身そのものが直接書き換わるという点です。これをプログラミング用語で「破壊的な処理(インプレース操作)」と呼びます。
わざわざ「新しい変数 = random.shuffle(リスト)」のように書く必要はなく、1行実行するだけで元のリストがランダムな状態にアップデートされます。非常に直感的で使いやすい関数ですね。
2. random.shuffleを使うときの注意点と事前準備
Pythonでリストの要素をバラバラに並べ替えるrandom.shuffleは非常に便利ですが、初心者がつまずきやすい「2つの重要なポイント」があります。これを知っておかないと、プログラムが動かなかったり、大切なデータを消してしまったりする原因になります。
① 使う前に「randomモジュール」を読み込む
まず、random.shuffleを使うには、あらかじめrandomモジュールを「import(インポート)」しておく必要があります。
Pythonの「モジュール」とは、特定の便利な機能がぎゅっと詰まった「道具箱」のようなものです。Pythonは最初から全ての道具が机に出ているわけではありません。「シャッフル機能を使いたい!」と思ったら、コードの一番上でimport randomと書いて、道具箱を机の上に持ってくる作業が必要になります。
② 「元のデータ」が直接書き換わる(破壊的変更)
ここが一番の注意点です。random.shuffleは、元のリストの中身を直接シャッフルします。「シャッフルされた新しいリスト」を作って返してくれるわけではありません。
これをプログラミング用語で「破壊的変更」と呼びます。例えば、「元の1, 2, 3...という順番も後で使いたい」という場合にそのままシャッフルしてしまうと、元の順番は二度と取り戻せなくなります。
「元の順番を保持したい場合」は、以下のサンプルのように.copy()を使って、一度リストのコピー(複製)を作ってから、そのコピーに対してシャッフルを行いましょう。
import random
# 1. 元のリストを作成
original_list = ["りんご", "バナナ", "みかん", "ぶどう"]
# 2. 元のデータを残すためにコピーを作成
shuffled_list = original_list.copy()
# 3. コピーしたリストの方だけをシャッフル
random.shuffle(shuffled_list)
# 4. 結果を表示して比較
print("元のリスト(順番そのまま):", original_list)
print("シャッフル後のリスト:", shuffled_list)
元のリスト(順番そのまま): ['りんご', 'バナナ', 'みかん', 'ぶどう']
シャッフル後のリスト: ['みかん', 'りんご', 'ぶどう', 'バナナ']
ポイント:未経験者の方は、まず「使う前にimportが必要」ということと、「元のデータが上書きされるから、心配ならコピーをとる」という2点だけを覚えておけば完璧です!
3. 文字列のリストをシャッフルしてみよう
数字だけでなく、文字列のリストもシャッフルできます。たとえば、名前のリストを使ってランダムな順番を作ることができます。
import random
names = ["田中", "佐藤", "鈴木", "高橋"]
random.shuffle(names)
print(names)
['鈴木', '高橋', '田中', '佐藤']
このように、shuffleはデータの種類に関係なく、リストであれば何でもランダムに並び替えることが可能です。
4. シャッフルを使った実用的な例
random.shuffleは、ゲームや抽選、クイズなどさまざまな場面で役立ちます。
たとえば、ランダムに質問を出したいときや、プレイヤーの順番を決めたいときなど。
次の例では、4人の名前からランダムな順番で「じゃんけんの順番」を決めています。
import random
players = ["ゆうき", "あい", "たかし", "さくら"]
random.shuffle(players)
for i, name in enumerate(players, 1):
print(f"{i}番目: {name}")
1番目: あい
2番目: たかし
3番目: ゆうき
4番目: さくら
5. シャッフルではなく、新しい順番を作りたいときは?
元のリストを変更せずに、新しいランダムな順番を作りたいときは、random.sampleを使う方法もあります。
sampleは、「元のリストを残しながら、ランダムな並びのコピー」を作ってくれる関数です。
import random
cards = ["A", "B", "C", "D"]
shuffled = random.sample(cards, len(cards))
print("元のカード:", cards)
print("シャッフル結果:", shuffled)
元のカード: ['A', 'B', 'C', 'D']
シャッフル結果: ['C', 'A', 'D', 'B']
random.shuffleは元のデータを壊す、random.sampleは元のデータを壊さない、という違いを覚えておきましょう。
6. random.shuffleと一緒によく使う関数
シャッフルした後に、先頭の1人だけを選ぶというような処理をしたいときもあります。
次の例では、シャッフルしたあと最初の1人を「今日の当番」にしています。
import random
students = ["山田", "中村", "鈴木", "井上"]
random.shuffle(students)
print("今日の当番は:", students[0])
今日の当番は: 鈴木
このように、shuffleのあとにインデックス(位置)で取り出せば、ランダムな1人を選ぶことができます。