Pregunta ¿Cómo seleccionar aleatoriamente un artículo de una lista?


Supongamos que tengo la siguiente lista:

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

¿Cuál es la forma más sencilla de recuperar un elemento al azar de esta lista?


1298
2017-11-20 18:42


origen


Respuestas:


Utilizar random.choice:

import random

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

Para opciones aleatorias criptográficamente seguras (por ejemplo, para generar una frase de contraseña de una lista de palabras), use random.SystemRandom clase:

import random

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

2129
2017-11-20 18:46



En caso de que también necesite el índice:

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

125
2017-09-11 15:31



Si desea seleccionar aleatoriamente más de un elemento de una lista, o seleccionar un elemento de un conjunto, le recomiendo usar random.sample en lugar.

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] 

Sin embargo, si solo está sacando un elemento de una lista, la opción es menos molesta, ya que el uso de la muestra tendría la sintaxis random.sample(some_list, 1)[0] en lugar de random.choice(some_list).

Desafortunadamente, la elección solo funciona para una única salida de secuencias (como listas o tuplas). Aunque random.choice(tuple(some_set)) puede ser una opción para obtener un solo elemento de un conjunto.


107
2018-05-27 17:07



Propongo una secuencia de comandos para eliminar elementos seleccionados aleatoriamente de una lista hasta que esté vacía:

Mantener un set y eliminar el elemento recogido aleatoriamente (con choice) hasta que la lista esté vacía.

s=set(range(1,6))
import random

while len(s)>0:
  s.remove(random.choice(list(s)))
  print(s)

Tres carreras dan tres respuestas diferentes:

>>> 
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([])

27
2018-05-13 02:47



A partir de Python 3.6, puedes usar secrets módulo, que es preferible a random módulo para criptografía o usos de seguridad.

Para imprimir un elemento aleatorio de una lista:

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

Para imprimir un índice aleatorio:

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

Para más detalles, ver PEP 506.


27
2017-12-05 16:52



Este es el código con una variable que define el índice aleatorio:

import random

foo = ['a', 'b', 'c', 'd', 'e']
randomindex = random.randint(0,len(foo)-1) 
print (foo[randomindex])
## print (randomindex)

Este es el código sin la variable:

import random

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

Y este es el código de la manera más breve e inteligente de hacerlo:

import random

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

(Python 2.7)


7
2018-05-25 14:57



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

En python 2:

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

En python 3:

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

7
2017-11-29 16:40