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


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

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

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


1271


источник


Ответы:


использование 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))

2092



Если вам также нужен индекс:

foo = ['a', 'b', 'c', 'd', 'e']
from random import randrange
random_index = randrange(0,len(foo))
print foo[random_index]

123



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


104



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

Поддерживать 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([])

26



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

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

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

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

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

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


26



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

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)


7



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

In python 2:

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

In python 3:

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

7



if you need the index just use:

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

random.choice does the same:)


6



How to randomly select an item from a list?

Assume I have the following list:

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

What is the simplest way to retrieve an item at random from this list?

If you want close to truly random, then I suggest using a SystemRandom object from the random module with the choice method:

>>> import random
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']

And now:

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

If you want a deterministic pseudorandom selection, use the choice function (which is actually a bound method on a Random object):

>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>

It seems random, but it's actually not, which we can see if we reseed it repeatedly:

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

4



We can also do this using 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)

3



I did this to get it to work:

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

-6