Как случайно выбрать элемент из списка?
Проблема
Как мне случайным образом выбрать элемент из следующего списка?
foo = ['a', 'b', 'c', 'd', 'e']
Я пытаюсь реализовать эту функциональность в своем коде на Python, но не знаю, как правильно это сделать. Есть ли какие-либо встроенные функции или библиотеки, которые могут помочь в этом?
5 ответ(ов)
Если вам нужно случайным образом выбрать несколько элементов из списка или выбрать элемент из множества, я бы порекомендовал использовать random.sample
.
import random
group_of_items = {'a', 'b', 'c', 'd', 'e'} # Кроме множеств, здесь подойдут и последовательности.
num_to_select = 2 # Укажите количество выбираемых элементов.
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.choice
будет менее громоздким, так как в этом случае синтаксис будет random.sample(some_list, 1)[0]
, вместо random.choice(some_list)
.
К сожалению, choice
работает только для выбора одного элемента из последовательностей (таких как списки или кортежи). Тем не менее, random.choice(tuple(some_set))
может быть вариантом для получения одного элемента из множества.
EDIT: Использование модуля Secrets
Как многие заметили, если вам нужны более безопасные псевдослучайные выборки, следует использовать модуль secrets
:
import secrets # импортируем безопасный модуль.
secure_random = secrets.SystemRandom() # создаем объект безопасного случайного выбора.
group_of_items = {'a', 'b', 'c', 'd', 'e'} # Здесь подойдут как последовательности, так и множества.
num_to_select = 2 # Укажите количество выбираемых элементов.
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]
EDIT: Питонический однострочник
Если вы хотите более питоническое решение для выбора нескольких элементов, можете использовать распаковку.
import random
first_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2)
Я предлагаю скрипт для удаления случайно выбранных элементов из множества до тех пор, пока оно не станет пустым:
Поддерживайте `set` и удаляйте случайно выбранный элемент (с помощью `choice`), пока множество не станет пустым.
```python
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([])
Каждый запуск приводит к различным результатам, так как элементы выбираются случайным образом. Это демонстрирует, как можно использовать set
и random
для динамического изменения множества.
В Python 2 для того, чтобы получить случайные элементы из списка foo
, вы можете использовать метод random.sample
, который возвращает заданное количество уникальных элементов:
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1
random_items = random.sample(population=foo, k=number_of_samples)
В Python 3 рекомендуется использовать random.choices
, если вы хотите получать элементы с возможностью повторения:
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1
random_items = random.choices(population=foo, k=number_of_samples)
Обратите внимание, что в Python 3 random.choices
может возвращать дубликаты, тогда как random.sample
в Python 2 всегда возвращает уникальные элементы.
Если вам нужен индекс, просто используйте следующий код:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(int(random.random() * len(foo)))
print(foo[int(random.random() * len(foo))])
Однако, random.choice выполняет ту же задачу более удобным способом:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Таким образом, если вы хотите получить случайный элемент из списка, использование random.choice будет более простым и удобным решением.
Короче говоря, используйте метод random.sample
Метод sample
возвращает новый список, содержащий элементы из исходной выборки, при этом оригинальная выборка остается неизменной. Полученный список сохраняет порядок выборки, что позволяет использовать все подсписки как допустимые случайные выборки.
import random
lst = ['a', 'b', 'c', 'd', 'e']
random.seed(0) # удалите эту строку, если хотите получить разные результаты при каждом запуске
rand_lst = random.sample(lst, 3) # 3 – это количество элементов, которые вы хотите получить
print(rand_lst)
# Вывод: ['d', 'e', 'a']
Вот работающий код: https://onecompiler.com/python/3xem5jjvz
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Самый быстрый способ проверить наличие значения в списке
Сравнение: генераторы списков против lambda + filter
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе