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

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

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

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

25 ответов

Решение

Использование random.choice:

import random

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

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

import random

foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

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

Однако, если вы извлекаете только один элемент из списка, выбор менее сложен, так как использование примера будет иметь синтаксис 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]

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

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

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

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

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

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

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

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

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

Поддерживать 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([])
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

В питоне 2:

random_items = random.sample(population=foo, k=number_of_samples)

В питоне 3:

random_items = random.choices(population=foo, k=number_of_samples)

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

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

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

Я обычно использую модуль random для работы со списками и рандомизацией

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

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

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

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

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

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

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')

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

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

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)

Вы могли просто:

from random import randint

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

print(foo[randint(0,4)])

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

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]

Дубликат /questions/24051788/vyiberite-n-predmetov-v-sluchajnom-poryadke-iz-posledovatelnosti-neizvestnoj-dlinyi/24051812#24051812

Возможно, это уже ответ, но вы можете использовать random.shuffle. Пример:

import random
foo = ['a', 'b', 'c', 'd', 'e']
random.shuffle(foo)

Мы также можем сделать это, используя 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)

рекомендуется numpyспособ теперь использовать явный ГСЧ:

      from numpy.random import default_rng

rng = default_rng()
rng.choice(foo)

Есть два способа, с помощью которых вы можете это сделать.

  1. Случайным методом
      import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
  1. Метод секретов
      import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))

Самый простой способ сделать это так:

import random    
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
import random
list=range(100)
random_value=random.choice(list)
print(random_value)

Чтобы выбрать несколько значений из спискаfoo = ['a', 'b', 'c', 'd', 'e'], см. следующую таблицу для соответствующего метода в каждом модуле.

С точки зрения производительности, это зависит от размера исходных данных и размера выборочных данных, но в целом лучше использоватьrandomесли тип данных представляет собой структуру данных Python, например список, тогда какnumpy/pandasлучше всего работают на своих собственных объектах, например, numpy ndarray, pandas Series.

Например, в следующем тесте (протестировано на Python 3.11.4, numpy 1.25.2 и pandas 2.0.3), где 20 тысяч элементов выбираются из объекта длиной 100 тысяч, numpy и pandas очень быстро работают с массивом и серией, но медленный по списку, в то время какrandom.choicesявляется самым быстрым в списке.

      import timeit

setup = """
import random
import pandas as pd
import numpy as np

li = list(range(100000))
ar = np.array(li)
sr = pd.Series(li)
n = len(li)//5
"""

min(timeit.repeat("random.choices(li, k=n)", setup, number=100))                     # 0.5333051000052365 
min(timeit.repeat("np.random.default_rng().choice(li, size=n)", setup, number=100))  # 0.9663617000041995 
min(timeit.repeat("pd.Series(li).sample(n=n, replace=True)", setup, number=100))     # 3.30128049999621 

min(timeit.repeat("random.choices(ar, k=n)", setup, number=100))                     # 0.5489860999950906 
min(timeit.repeat("np.random.default_rng().choice(ar, size=n)", setup, number=100))  # 0.030448100005742162 
min(timeit.repeat("pd.Series(ar).sample(n=n, replace=True)", setup, number=100))     # 0.07655550000345102 

min(timeit.repeat("random.choices(sr, k=n)", setup, number=100))                     # 6.577740900000208 
min(timeit.repeat("np.random.default_rng().choice(sr, size=n)", setup, number=100))  # 0.0323493999967468 
min(timeit.repeat("sr.sample(n=n, replace=True)", setup, number=100))                # 0.06925690000207396

Вы можете случайным образом распечатать/выбрать элемент из заданного словаря, рандомизировав аргументы нарезки с помощью метода нарезки. Но убедитесь, что вы импортировали случайный модуль, это большой мальчик.

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

Здесь мы устанавливаем случайное число в аргументе slice. Любое число, указанное в foo[], вернет элемент, достигший индекса, аналогичного числу, указанному в slice. Просто установка случайного числа сделает вашу работу.

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

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

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

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

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

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

Другие вопросы по тегам