web-dev-qa-db-ja.com

リストからアイテムをランダムに選択する方法

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

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

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

1550
Ray Vega

random.choice() を使用

import random

foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))

暗号学的に安全なランダムな選択(例えば、単語リストからパスフレーズを生成するため)のために、 random.SystemRandom classを使用してください。

import random

foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

または secrets.choice()

import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
2455
Pēteris Caune

リストから複数の項目をランダムに選択したい場合、またはセットから項目を選択したい場合は、代わりにrandom.sampleを使用することをお勧めします。

import random
group_of_items = {1, 2, 3, 4}               # 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)という構文になるため、選択はそれほどぎこちなくなります。

残念ながら、choiceはシーケンスからの単一の出力(リストやタプルなど)に対してのみ機能します。 random.choice(Tuple(some_set))はセットから単一の項目を取得するためのオプションかもしれませんが。

編集:秘密を使う

多くの人が指摘しているように、より安全な疑似乱数サンプルが必要な場合は、secretsモジュールを使用する必要があります。

import secrets                              # imports secure module.
secure_random = secrets.SystemRandom()      # creates a secure random object.
group_of_items = {1, 2, 3, 4}               # 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]
157
Paul

索引も必要な場合は、 random.randrange を使用してください。

from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
146
Juampi

Python 3.6以降では secrets モジュールを使うことができます。これは暗号化やセキュリティのためには random モジュールより望ましいです。

リストからランダムな要素を印刷するには:

import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))

ランダムなインデックスを印刷するには

print(secrets.randbelow(len(foo)))

詳細については、 PEP 506 を参照してください。

35
Chris_Rands

リストが空になるまでランダムに拾ったアイテムをリストから削除するスクリプトを提案します。

setを維持し、listが空になるまでランダムに拾った要素を(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([])
31
kiriloff
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

Python 2では:

random_items = random.sample(population=foo, k=number_of_samples)

Python 3の場合:

random_items = random.choices(population=foo, k=number_of_samples)
12
Fardin

リストからアイテムをランダムに選択する方法

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

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

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

真にランダムな に近い場合は、SystemRandomモジュールのrandomオブジェクトをchoiceメソッドで使用することをお勧めします。

>>> import random
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']

そしていま:

>>> sr.choice(foo)
'd'
>>> sr.choice(foo)
'e'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'b'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'c'
>>> sr.choice(foo)
'c'

確定的疑似乱数選択が必要な場合は、choice関数を使用します(これは実際にはRandomオブジェクトに対するバウンドメソッドです)。

>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>

これはランダムに見えますが、実際にはそうではありません。繰り返し再シードすればわかります。

>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
9
Aaron Hall

numpyソリューション: numpy.random.choice

この質問については、受け入れられた答え(import random; random.choice())と同じように機能しますが、プログラマがすでにnumpyをインポートしている可能性があるため(私と同様)、また 実際の使用例に関係する可能性のある2つの方法

import numpy as np    
np.random.choice(foo) # randomly selects a single item

再現性のために、次のことができます。

np.random.seed(123)
np.random.choice(foo) # first call will always return 'c'

arrayとして返される1つ以上のアイテムのサンプルの場合は、size引数を渡します。

np.random.choice(foo, 5)          # sample with replacement (default)
np.random.choice(foo, 5, False)   # sample without replacement
8
C8H10N4O2

あなたがインデックスが必要な場合は単に使用してください:

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

random.choiceも同じことをします:)

8
Janek Olszak

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

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))

(python 2.7)

7
Liam

Randintを使ってこれを行うこともできます。

from random import randint
l= ['a','b','c']

def get_Rand_element(l):
    if l:
        return l[randint(0,len(l)-1)]
    else:
        return None

get_Rand_element(l)
2
Abdul Majeed

次のコードは、同じアイテムを作成する必要があるかどうかを示しています。抽出するサンプル数を指定することもできます。
sampleメソッドは、元の母集団を変更せずに母集団の要素を含む新しいリストを返します。結果のリストは選択順になっているため、すべてのサブスライスも有効なランダムサンプルになります。

import random as random
random.seed(0)  # don't use seed function, if you want different results in each run
print(random.sample(foo,3))  # 3 is the number of sample you want to retrieve

Output:['d', 'e', 'a']
2
Memin

あなたがこのような何かを探しているなら、一つの簡単な解決策:

from random import *
library = ["New York", "Berlin", "Rome"]

for x in range (10):
    i = randrange(0,3)
    print(library[i])
2
lorde

ランダムなアイテム選択:

import random

my_list = [1, 2, 3, 4, 5]
num_selections = 2

new_list = random.sample(my_list, num_selections)

リストの順序を保持するには、次のようにします。

randIndex = random.sample(range(len(my_list)), n_selections)
randIndex.sort()
new_list = [my_list[i] for i in randIndex]

https://stackoverflow.com/a/49682832/4383027 の重複

0
Solomon Vimal
import random
list=range(100)
random_value=random.choice(list)
print(random_value)
0
Ravi G