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

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

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

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

Ответы

Ответ 1

Используйте 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))

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Чтобы напечатать случайный индекс:

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

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

Ответ 5

Я предлагаю 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([])

Ответ 6

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)

Ответ 7

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

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

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

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

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

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

Ответ 9

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

Ответ 10

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

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)

Ответ 11

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

Ответ 12

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

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

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

Ответ 13

Мы также можем сделать это с помощью 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)

Ответ 14

Случайный выбор предмета:

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]

Дубликат fooobar.com/questions/1797/...

Ответ 15

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

import random
pick = ['Random','Random1','Random2','Random3']
print  (pick[int(random.random() * len(pick))])

Ответ 16

import random_necessary
pick = ['Miss','Mrs','MiSs','Miss']
print  pick [int(random_necessary.random_necessary() * len(pick))]

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