¿Cómo puedo seleccionar (elegir) aleatoriamente un elemento de una lista (obtener un elemento aleatorio)?
¿Cómo recupero un elemento al azar de la siguiente lista?
foo = ['a', 'b', 'c', 'd', 'e']
Usar random.choice()
:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Para elecciones aleatorias criptográficamente seguras (por ejemplo, para generar una frase de contraseña a partir de una lista de palabras), utilice secrets.choice()
:
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secrets
es nuevo en Python 3.6. En versiones anteriores de Python puedes usar la random.SystemRandom
clase:
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
Si desea seleccionar aleatoriamente más de un elemento de una lista, o seleccionar un elemento de un conjunto, le recomiendo utilizarlo random.sample
.
import random
group_of_items = {'a', 'b', 'c', 'd', 'e'} # 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ás extrayendo un único elemento de una lista, la elección es menos complicada, ya que usar sample tendría la sintaxis random.sample(some_list, 1)[0]
en lugar de random.choice(some_list)
.
Desafortunadamente, sin embargo, la elección sólo 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 artículo de un conjunto.
EDITAR: Usar secretos
Como muchos han señalado, si necesita muestras pseudoaleatorias más seguras, debe usar el módulo secretos:
import secrets # imports secure module.
secure_random = secrets.SystemRandom() # creates a secure random object.
group_of_items = {'a', 'b', 'c', 'd', 'e'} # 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]
EDITAR: Una sola línea pitónica
Si desea una línea más pitónica para seleccionar varios elementos, puede utilizar desempaquetar.
import random
first_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2)
Si también necesita el índice, utilicerandom.randrange
from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
A partir de Python 3.6, puede utilizar el secrets
módulo, que es preferible al random
módulo para usos de criptografía o 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, consulte PEP 506 .
Propongo un script para eliminar elementos seleccionados aleatoriamente de una lista hasta que esté vacía:
Mantenga set
y elimine el elemento seleccionado 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([])
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)