シーケンスからランダムに要素を抽出する関数

シーケンスからランダムに要素を抽出する関数

ランダムに要素を抜き出す関数

 標準ライブラリの randomモジュールには、シーケンスからランダム(無作為)に要素を抽出する関数が揃っています。

random.choice() ランダムに要素を抽出

 random.choice(seq)

 random.choice(seq) は引数 seq に渡したシーケンス(文字列、リスト、タプルなど)から要素をランダムに選んで返します(どの要素も等しい確率で選ばれます)。

# https://python.atelierkobato.com/choice/

# randomモジュールをインポート
import random

# 恒星リストを用意
star = ["太陽", "シリウス", "アケルナル", "ベガ", "プロキオン"]

# 恒星リストから3回ランダムに要素を抽出
for k in range(3):
    x = random.choice(star)
    print(x, " ", end = "")
アケルナル ベガ シリウス

 

random.sample() ランダムに要素を抽出してリストを作成

 random.sample(population, k)

 random.sample() は population に指定したシーケンスまたは集合から k 個の要素を重複なしで抽出して、それらを要素に持つ新しいリストを作成します。

# https://python.atelierkobato.com/choice/

# randomモジュールをインポート
import random

# 恒星の集合(set)を用意
star = {"カノープス", "アルタイル", "カペラ", "デネブ", "カストル"}

# 3個の要素をランダムに抽出して新しいリストを作成(重複なし)
x = random.sample(star, 3)

print(x)
['アルタイル', 'デネブ', 'カノープス']

 

random.choices() ランダムに要素を抽出してリストを作成

 random.choices(population, weights=None, *, cum_weights=None, k=1)

 random.choices() は population に指定したシーケンスまたは集合から引数 k に指定した個数の要素を重複ありで無作為抽出し、それらを要素に持つ新しいリストを作成します。引数 weights に相対的な重みのシーケンスを渡すと、各要素が選ばれる確率を調整することができます。

# https://python.atelierkobato.com/choice/

# randomモジュールをインポート
import random

# 恒星リストを用意
star = ["アルデバラン", "スピカ", "リゲル", "ベテルギウス", "エルナト"]

# 相対的な重みのリスト
w = [1, 1, 2, 2, 4]

# 各要素に重みwをつけて、5個の要素をランダムに抽出してリストを作成
x = random.choices(star, k = 5, weights = w)

print(x)
['スピカ', 'エルナト', 'エルナト', 'ベテルギウス', 'エルナト']

 上のサンプルコードでは相対的な重みのリストを [1, 1, 2, 2, 4] で指定しています。これによって、たとえばリストの 3 つめの要素(インデックス 2 の要素)"リゲル" は
 

2/(1+1+2+2+4) = 2/10 = 1/5

の確率で選び出されることになります。random.choices() は引数 cum_weights で累積的な重みを指定することもできます (weights と同時に指定することはできません)。サンプルコードは割愛しますが、相対的な重み [1, 1, 2, 2, 4] は、累積的な重み [1, 2, 4, 6, 10] と等価です。
 

random.shuffle() シーケンスの要素をシャッフル

 random.shuffle(x [, random])

 random.shuffle() はミュータブル(変更可能)なシーケンス x の要素をランダムな順に並べ替えます(もとのシーケンス自体が書き換えられます)。オプション引数 random には 0.0 以上 1.0 未満の浮動小数点乱数を指定しますが、通常は省略して問題ありません(デフォルトで random() 関数が与えられます)。

# https://python.atelierkobato.com/choice/

# randomモジュールをインポート
import random

# 恒星リストを用意
star = ["カノープス", "アルタイル", "カペラ", "デネブ", "カストル"]

# リストをシャッフル
random.shuffle(star)

print(star)
['アルタイル', 'カペラ', 'カノープス', 'カストル', 'デネブ']

 この関数の引数 x にはタプルのようなイミュータブルなシーケンスを渡すことはできません。イミュータブルなシーケンスをシャッフルさせたい場合は、代わりに sample(x, k = len(x)) を使ってください。