Pythonでリストをシャッフルする方法

Pythonでリストの要素をランダムにシャッフルしたい時は、次の方法があります。

  • random.shuffle()関数
  • random.sample()関数

前者は元のリストをシャッフルして、後者は要素をシャッフルした新しいリストを作ります。まずはこの2つについて解説します。

その後、機械学習の性能評価などで常に同じシャッフル結果を使いたい場合に、乱数を固定するrandom.seed()関数についても解説します。

目次

1. random.shuffle()関数

random.shuffle()関数は、引数に渡したリストの要素をシャッフルします。要素をシャッフルした新しいリストを作るのではなくて、元のリストをシャッフルします。

random.shuffle()を使うには、乱数を作成するrandomモジュールをインポートしておく必要があります。モジュールについては「Pythonのモジュールについて」で解説しています。

In [1]:
import random  # 最初にrandomモジュールをインポート

nums = [0, 1, 2, 3, 4]
random.shuffle(nums)
print(nums)
[3, 2, 0, 1, 4]

random.shuffle()は、引数に渡したリストに変更を加えるもののため、関数の実行結果を出力してもNoneになります。

In [2]:
print(random.shuffle(nums))
None

2. random.sample()関数

random.sample()関数もリストの要素をシャッフルするものですが、random.shuffle()関数とは次の2点が異なります。

  • 引数に渡したリストの要素をシャッフルした新しいリストを作る
  • 第二引数でリストの要素を何個取り出すかを指定する

実際に見てみましょう。

以下の例では、第二引数に「len(nums)」を書いて全部の要素をシャッフルして取り出しています。len()関数は「Pythonのリストの要素数を確認する方法」で解説しています。

In [1]:
import random

nums = [0, 1, 2, 3, 4]
nums_shuffled = random.sample(nums, len(nums))
print(nums_shuffled)
[1, 4, 2, 3, 0]

第二引数で指定した数だけ要素をランダムに取り出します。

In [2]:
import random
nums = [0, 1, 2, 3, 4]

two_nums = random.sample(nums, 2)
print(two_nums)

three_nums = random.sample(nums, 3)
print(three_nums)
[1, 4]
[4, 1, 2]

3. random.seed()関数

random.shuffle()もrandom.sample()も、実行する度に、ランダムに要素をシャッフルします。

しかし時には、機械学習などの性能評価の時に、乱数を固定しておきたいという場合もあります。そんな場合はrandom.seed()関数を使います。

random.seed()関数の引数に任意の数値を入れて実行してから、random.shuffle()やrandom.sample()を使うと、毎回同じシャッフル結果を得ることができます。

まず次のシャッフル結果をご覧ください。

In [1]:
nums = [0, 1, 2, 3, 4]
random.seed(0)  # これで乱数を固定しています。

random.shuffle(nums)
print(f'シャッフル1回目:{nums}')

random.shuffle(nums)
print(f'シャッフル2回目:{nums}')

random.shuffle(nums)
print(f'シャッフル3回目:{nums}')
シャッフル1回目:[2, 1, 0, 4, 3]
シャッフル2回目:[2, 0, 1, 4, 3]
シャッフル3回目:[0, 2, 3, 1, 4]

以下は、上とは別にもう一度random.shuffle()を実行したものですが、1, 2, 3回目とも、上と同じ出力結果になっていますね。

In [2]:
nums = [0, 1, 2, 3, 4]
random.seed(0) # これで上と同じ乱数になる。

random.shuffle(nums)
print(f'シャッフル1回目:{nums}')

random.shuffle(nums)
print(f'シャッフル2回目:{nums}')

random.shuffle(nums)
print(f'シャッフル3回目:{nums}')
シャッフル1回目:[2, 1, 0, 4, 3]
シャッフル2回目:[2, 0, 1, 4, 3]
シャッフル3回目:[0, 2, 3, 1, 4]

4. まとめ

ポイントをまとめておきます。

random.shuffle()関数は、引数に渡したリストをシャッフルします。

random.sample()関数は、第一引数に渡したリストの要素をランダムに取り出して新しいリストを作ります。第二引数で必ず取り出す要素の数を指定する必要があります。

最後に、シャッフルの乱数を固定するには、random.seed()関数を使います。

Python初心者におすすめのプログラミングスクール

「未経験からでもPythonを学べるプログラミングスクールを探しているけど、色々ありすぎてわからない」なら、次の3つのプログラミングスクールから選んでおけば間違いはありません。

Aidemy Premium:全くの初心者ができるだけ効率よく短期間で実務的に活躍できるAI人材になることを目的とした講座。キャリアカウンセリングや転職エージェントの紹介などの転職支援も充実しており、受講者の転職成功率が高い。

AIジョブカレPythonの基本をおさえた人が、実際に機械学習やディープラーニングを活用できるようになるための講座。転職補償型があるなどキャリア支援の内容が非常に手厚く、講師の質も最高クラス。コスパ最高。Python初心者用の対策講座もある。

データミックスプログラミング経験者のビジネスマンが、更なるキャリアアップのためにデータの処理方法を学んでデータサイエンティストになるための講座。転職だけでなく起業やフリーランスとして独立する人も多い。Python初心者用の対策講座もある。

特に、あなたが以下のような目標を持っているなら、この中から選んでおけば間違いはないでしょう。

・未経験からPythonエンジニアとして就職・転職したい
・AIエンジニアやデータサイエンティストとしてキャリアアップしたい
・起業やフリーランスを視野に入れたい

理由は「Python初心者のためのおすすめプログラミングスクール3選」で解説しています。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる