24

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

17

Проблема

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

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

Я пытаюсь реализовать эту функциональность в своем коде на Python, но не знаю, как правильно это сделать. Есть ли какие-либо встроенные функции или библиотеки, которые могут помочь в этом?

5 ответ(ов)

2

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

Поддерживайте `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 для динамического изменения множества.

0

В 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 всегда возвращает уникальные элементы.

0

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

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 будет более простым и удобным решением.

0

Короче говоря, используйте метод 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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь