Как случайным образом выбрать элемент из списка?
Предположим, у меня есть следующий список:
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]
Возможно, это уже ответ, но вы можете использовать
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)
Есть два способа, с помощью которых вы можете это сделать.
- Случайным методом
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
- Метод секретов
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))]
Я надеюсь, что вы найдете это решение полезным.