Pythonでリストの要素をランダムにシャッフルする(順序をごちゃ混ぜにする)には、random モジュールの sample() 関数を使う方法と shuffle() 関数を使う方法の2通りがあります。
これらは「並び替える」という結果は同じですが、元のリストを変更するかどうかという点で挙動が異なります。それぞれの特性を理解し、用途に応じて使い分ける方法を解説します。
目次
1. random.sample():新しいリストを作成(非破壊的)
random.sample() 関数は、指定されたシーケンスから指定された数の要素をランダムに取得して新しいリストを作成します。
ここで「取得数」に「リストの全要素数(長さ)」を指定することで、元のリストを維持したまま、中身がシャッフルされた新しいリストを得ることができます。
実装例:音楽プレイリストのシャッフル再生
アルバムの曲順データ(元のリスト)は保持したまま、再生用のランダムなプレイリストを作成するシナリオです。
import random
# アルバムの曲リスト
album_tracks = [
"Track 01: Intro",
"Track 02: Summer Breeze",
"Track 03: Midnight Blue",
"Track 04: The Finale"
]
# 第1引数:対象のリスト
# 第2引数:取得する要素数(ここではリストの長さ=全要素)
# 元のリストは変更されず、シャッフルされた新しいリストが返されます
shuffled_playlist = random.sample(album_tracks, len(album_tracks))
print("--- Original Album ---")
print(album_tracks)
print("\n--- Shuffled Playlist ---")
print(shuffled_playlist)
実行結果(例)
--- Original Album ---
['Track 01: Intro', 'Track 02: Summer Breeze', 'Track 03: Midnight Blue', 'Track 04: The Finale']
--- Shuffled Playlist ---
['Track 03: Midnight Blue', 'Track 01: Intro', 'Track 04: The Finale', 'Track 02: Summer Breeze']
2. random.shuffle():リスト自体を更新(破壊的)
random.shuffle() 関数は、渡されたリスト自体をその場で(インプレースで)ランダムに並び替えます。
新しいリストを作成しないためメモリ効率は良いですが、元の順序は失われます。戻り値は None です。
実装例:カードゲームのデッキ操作
カードの山札(デッキ)をよく切って、順番を完全に変えてしまうシナリオです。
import random
# カードのデッキ(簡略化のため4枚)
deck = ["Ace of Spades", "King of Hearts", "Queen of Diamonds", "Jack of Clubs"]
print(f"Before shuffle: {deck}")
# リスト自体を書き換えます(戻り値はないので変数に代入してはいけません)
random.shuffle(deck)
print(f"After shuffle : {deck}")
実行結果(例)
Before shuffle: ['Ace of Spades', 'King of Hearts', 'Queen of Diamonds', 'Jack of Clubs']
After shuffle : ['Queen of Diamonds', 'Ace of Spades', 'Jack of Clubs', 'King of Hearts']
まとめ
| 関数 | 構文 | 元のリスト | 特徴 |
| sample | random.sample(l, len(l)) | 変更なし | 元のデータを残したい場合に使用。新しいリストを返す。 |
| shuffle | random.shuffle(l) | 変更される | メモリを節約したい場合や、元の順序が不要な場合に使用。 |
用途に合わせて、非破壊的な sample と破壊的な shuffle を選択してください。
