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

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

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

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

+1525
20 нояб. '08 в 18:42
источник поделиться
15 ответов

Используйте random.choice()

import random

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

Для криптографически безопасного случайного выбора (например, для генерации ключевой фразы из random.SystemRandom слов) используйте класс random.SystemRandom

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))
+2429
20 нояб. '08 в 18:46
источник

Связанные вопросы


Похожие вопросы

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

К сожалению, выбор работает только для одного вывода из последовательностей (таких как списки или кортежи). Хотя 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]
+155
27 мая '15 в 17:07
источник

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

from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
+145
11 сент. '12 в 15:31
источник

С 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
05 дек. '16 в 16:52
источник

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

Поддерживайте 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([])
+31
13 мая '13 в 2:47
источник
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)
+10
29 нояб. '17 в 16:40
источник

если вам нужен только индекс:

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

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

+8
23 дек. '12 в 22:06
источник

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

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

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
17 июл. '18 в 16:20
источник

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

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
25 мая '15 в 14:57
источник

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

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

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')
+7
23 июн. '17 в 22:22
источник

Одно простое решение, если вы ищете что-то вроде этого:

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

for x in range (10):
    i = randrange(0,3)
    print(library[i])
+2
19 окт. '18 в 14:15
источник

Мы также можем сделать это с помощью 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
05 авг. '14 в 7:28
источник

Следующий код демонстрирует, нужно ли вам производить одинаковые предметы. Вы также можете указать, сколько образцов вы хотите извлечь.
Метод 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
12 окт. '18 в 15:47
источник

Я сделал это, чтобы заставить его работать:

import random
pick = ['Random','Random1','Random2','Random3']
print  (pick[int(random.random() * len(pick))])
-7
02 февр. '14 в 20:00
источник
import random_necessary
pick = ['Miss','Mrs','MiSs','Miss']
print  pick [int(random_necessary.random_necessary() * len(pick))]

Я надеюсь, что вы найдете это решение полезным.

-19
28 сент. '13 в 8:09
источник

Посмотрите другие вопросы по меткам или Задайте вопрос