Как случайным образом выбрать элемент из списка? - PullRequest
1565 голосов
/ 20 ноября 2008

Предположим, у меня есть следующий список:

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

Какой самый простой способ случайного выбора элемента из этого списка?

Ответы [ 15 ]

2471 голосов
/ 20 ноября 2008

Использование 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))
159 голосов
/ 27 мая 2015

Если вы хотите случайным образом выбрать более одного элемента из списка или выбрать элемент из набора, я бы рекомендовал вместо этого использовать 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] 

Если вы вытаскиваете только один элемент из списка, выбор менее сложен, поскольку при использовании примера будет иметь синтаксис random.sample(some_list, 1)[0] вместо random.choice(some_list).

К сожалению, выбор работает только для одного вывода из последовательностей (таких как списки или кортежи). Хотя random.choice(tuple(some_set)) может быть вариантом для получения одного предмета из набора.

РЕДАКТИРОВАТЬ: Использование секретов

Как отмечали многие, если вам требуются более безопасные псевдослучайные образцы, вы должны использовать модуль секретов:

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]
146 голосов
/ 11 сентября 2012

Если вам также нужен индекс, используйте random.randrange

from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
35 голосов
/ 05 декабря 2016

Начиная с Python 3.6, вы можете использовать модуль secrets, который предпочтительнее модуля random для криптографии или защиты.

Чтобы распечатать случайный элемент из списка:

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

Для печати случайного индекса:

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

Подробнее см. PEP 506 .

31 голосов
/ 13 мая 2013

Я предлагаю скрипт для удаления случайно выбранных предметов из списка, пока он не станет пустым:

Сохраняйте set и удаляйте случайно выбранный элемент (с помощью choice), пока список не станет пустым.

s=set(range(1,6))
import random

while len(s)>0:
  s.remove(random.choice(list(s)))
  print(s)

Три прогона дают три разных ответа:

>>> 
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([])
12 голосов
/ 29 ноября 2017
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

В питоне 2:

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

В питоне 3:

random_items = random.choices(population=foo, k=number_of_samples)
9 голосов
/ 24 июня 2017

Как случайным образом выбрать элемент из списка?

Предположим, у меня есть следующий список:

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')
8 голосов
/ 24 декабря 2012

если вам нужен индекс, просто используйте:

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

random.choice делает то же самое:)

7 голосов
/ 17 июля 2018

numpy решение: numpy.random.choice

Для этого вопроса он работает так же, как принятый ответ (import random; random.choice()), но я добавил его, потому что программист, возможно, уже импортировал numpy (как и я) И также есть некоторые различия между двумя методами , которые могут касаться вашего фактического варианта использования.

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, передайте аргумент size:

np.random.choice(foo, 5)          # sample with replacement (default)
np.random.choice(foo, 5, False)   # sample without replacement
7 голосов
/ 25 мая 2015

Это код с переменной, которая определяет случайный индекс:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...