次のリストがあるとします。
foo = ['a', 'b', 'c', 'd', 'e']
このリストからアイテムをランダムに取得する最も簡単な方法は何ですか?
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
暗号的に安全なランダムな選択 (たとえば、単語リストからパスフレーズを生成するため) には、次を使用しますsecrets.choice()
。
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secrets
は Python 3.6 の新機能です。random.SystemRandom
古いバージョンの Python では、次のクラスを使用できます。
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
リストから複数のアイテムをランダムに選択する場合、またはセットからアイテムを選択する場合は、random.sample
代わりに使用することをお勧めします。
import random
group_of_items = {'a', 'b', 'c', 'd', 'e'} # a sequence or set will work here.
num_to_select = 2 # set the number to select here.
list_of_random_items = random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
ただし、リストから単一のアイテムのみを取得する場合は、 sample を使用するrandom.sample(some_list, 1)[0]
とrandom.choice(some_list)
.
残念ながら、選択はシーケンス (リストやタプルなど) からの単一の出力に対してのみ機能します。random.choice(tuple(some_set))
セットから単一のアイテムを取得するためのオプションかもしれませんが。
編集:シークレットの使用
多くの人が指摘しているように、より安全な疑似乱数サンプルが必要な場合は、secret モジュールを使用する必要があります。
import secrets # imports secure module.
secure_random = secrets.SystemRandom() # creates a secure random object.
group_of_items = {'a', 'b', 'c', 'd', 'e'} # a sequence or set will work here.
num_to_select = 2 # set the number to select here.
list_of_random_items = secure_random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
編集: Pythonic ワンライナー
複数のアイテムを選択するためのより Pythonic なワンライナーが必要な場合は、アンパックを使用できます。
import random
first_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2)
インデックスも必要な場合は、random.randrange
from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
空になるまでリストからランダムに選択されたアイテムを削除するためのスクリプトを提案します。
リストが空になるまでa を維持し、set
ランダムにピックアップされた要素 ( を使用) を削除します。choice
s=set(range(1,6))
import random
while len(s)>0:
s.remove(random.choice(list(s)))
print(s)
3 回実行すると、3 つの異なる答えが得られます。
>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])
>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
インデックスが必要な場合は、次を使用してください。
import random
foo = ['a', 'b', 'c', 'd', 'e']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]
random.choiceは同じことを行います:)
これは、ランダム インデックスを定義する変数を含むコードです。
import random
foo = ['a', 'b', 'c', 'd', 'e']
randomindex = random.randint(0,len(foo)-1)
print (foo[randomindex])
## print (randomindex)
これは変数のないコードです:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print (foo[random.randint(0,len(foo)-1)])
そして、これはそれを行うための最も短くて賢い方法のコードです:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
(パイソン2.7)