Вопрос-Ответ

How can I randomly select (choose) an item from a list (get a random element)?

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

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

foo = ['a', 'b', 'c', 'd', 'e']
Переведено автоматически
Ответ 1

Использование 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. В более старых версиях Python вы можете использовать класс random.SystemRandom:

import random

secure_random = random.SystemRandom()
print(secure_random.choice(foo))
Ответ 2

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

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

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

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 One-Liner

Если вам нужен более питонический однострочник для выбора нескольких элементов, вы можете использовать распаковку.

import random
first_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2)
Ответ 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 .

python list