2144

次のリストがあるとします。

foo = ['a', 'b', 'c', 'd', 'e']

このリストからアイテムをランダムに取得する最も簡単な方法は何ですか?

4

18 に答える 18

3168

使用random.choice():

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))
于 2008-11-20T18:46:39.470 に答える
256

リストから複数のアイテムをランダムに選択する場合、またはセットからアイテムを選択する場合は、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)
于 2015-05-27T17:07:07.017 に答える
178

インデックスも必要な場合は、random.randrange

from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
于 2012-09-11T15:31:16.497 に答える
42

空になるまでリストからランダムに選択されたアイテムを削除するためのスクリプトを提案します。

リストが空になるまで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([])
于 2013-05-13T02:47:36.817 に答える
15

インデックスが必要な場合は、次を使用してください。

import random
foo = ['a', 'b', 'c', 'd', 'e']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]

random.choiceは同じことを行います:)

于 2012-12-23T22:06:36.427 に答える
8

これは、ランダム インデックスを定義する変数を含むコードです。

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)

于 2015-05-25T14:57:25.813 に答える