リストからランダムに要素や値を選択することは一般的なタスクです – それは勧告のリストからランダムな結果または単にランダムなプロンプトのためです。
この記事では、Pythonでリストからランダムに要素を選択する方法を見ていきます。単数のランダムな要素の取得と、複数の要素の取得(繰り返しがある場合とない場合)をカバーします。
Pythonのリストからランダムな要素を選択する
この問題を解決する最も直感的で自然なアプローチは、リストから要素にアクセスするためのインデックスとして機能する乱数を生成することです。
このアプローチを実装するために、Pythonで乱数を生成するいくつかのメソッドを見てみましょう。乱数.randint()と
random.randrange()です。さらに、
random.choice()` を使って、イテラブルを指定すると、そのイテラブルからランダムな要素が返されます。
random.randint() の使用法
random.randint(a, b)は、
aと
b` の間のランダムな整数を返します。
0から
len(list)-1` までの範囲のランダムなインデックスが欲しいところです。
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f']
random_index = random.randint(0,len(letters)-1)
print(letters[random_index])
このコードを複数回実行すると、次のようになります。
e
c
f
a
random.randrange() の使用法
random.randrange(a)
は、 0 <= n < a
となる乱数 n
を返す別のメソッドです。
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f']
random_index = random.randrange(len(letters))
print(letters[random_index])
このコードを複数回実行すると、次のようなものが生成されます。
f
d
d
e
random.randrange(len(letters))は
0から
len(letters) – 1までの範囲でランダムに生成された数を返すので、先ほどの方法と同じように、それを使って
letters` にあるランダムな要素にアクセスしてみましょう。
この方法は先ほどの方法よりも少しシンプルです。なぜなら、開始点を指定しないので、デフォルトでは 0
になるからです。
random.choice() の使用
さて、先ほどよりもさらに良い解決策は、random.choice()
を使うことです。これはまさにこの問題を解決するために設計された関数だからです。
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f']
print(random.choice(letters))
これを複数回実行すると、次のようになります。
b
e
e
f
e
Python のリストから複数のランダムな要素を選択する
random.sample()の使用法
複数の要素をランダムに選択するために利用できる最初のメソッドは random.sample()
です。これは、観測したいサンプルの数に基づいて、サンプルを生成します。
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f']
print(random.sample(letters, 3))
これはリストを返します。
['d', 'c', 'a']
このメソッドは、要素を置換せずに選択します。つまり、重複や繰り返しを排除して選択します。
これを実行すると
print(random.sample(letters, len(letters)))
重複を返さないので、リスト全体をランダムな順序で返すだけです。
['a', 'e', 'c', 'd', 'f', 'b']
random.choices() の使用法
前の関数と同様に、 random.choices()
は与えられたイテラブルからランダムに選択された要素のリストを返します。ただし、選択された要素を追跡しないので、重複した要素を取得することもできます。
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f']
print(random.choices(letters, k=3))
これは、以下のようなものを返します。
コード偽
また、実行すると
['e', 'f', 'f']
のようなものが返ってくることもある。
print(random.choices(letters, k = len(letters)))
random.choices
は k
サイズのリストで、ランダムに選択された要素を置換して返します。
このメソッドは、重み付けされたランダムチョイスを実装するために使うこともできます。
繰り返しのないランダムなn個の要素を選択する
n 個の要素からなる、繰り返しのないランダムな集合を作りたい場合、このタスクは前のタスクよりも複雑に見えますが、実際にはとても簡単です。
リストを shuffle()
して、n 個のパーツに分割します。これはリストをスライスしているだけなので、重複する要素が追加されないことを保証します。また、コレクションがランダムになるようにシャッフルしています。
リストをランダムに分割する方法についてもっと知りたい場合は、 Pythonでリストを均等に分割する方法を参照してください。
をご覧ください。
結果を新しいリストに保存し、最終的なコレクションに十分な要素がない場合は、単に未完成とします。
['d', 'e', 'b', 'd', 'd', 'd']
この結果、繰り返しのない、ランダムなペアのリストができあがります。
import random
def select_random_Ns(lst, n):
random.shuffle(lst)
result = []
for i in range(0, len(lst), n):
result.append(lst[i:i + n])
return result
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(select_random_Ns(lst, 2))
結論
この記事では、Python で List からランダムに選ばれた要素を取得する方法をいくつか紹介しました。
randint()と
randrange()を使ってランダムなインデックスでリストにアクセスし、
choice()と
sample()` を使ってランダムな要素を取得しました。