¿Cómo puedo seleccionar (elegir) aleatoriamente un elemento de una lista (obtener un elemento aleatorio)?

Resuelto Ray asked hace 16 años • 18 respuestas

¿Cómo recupero un elemento al azar de la siguiente lista?

foo = ['a', 'b', 'c', 'd', 'e']
Ray avatar Nov 21 '08 01:11 Ray
Aceptado

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

secretses nuevo en Python 3.6. En versiones anteriores de Python puedes usar la random.SystemRandomclase:

import random

secure_random = random.SystemRandom()
print(secure_random.choice(foo))
Pēteris Caune avatar Nov 20 '2008 18:11 Pēteris Caune

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)
Paul avatar May 27 '2015 17:05 Paul

Si también necesita el índice, utilicerandom.randrange

from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
Juan Pablo Rinaldi avatar Sep 11 '2012 15:09 Juan Pablo Rinaldi

A partir de Python 3.6, puede utilizar el secretsmódulo, que es preferible al randommó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 .

Chris_Rands avatar Dec 05 '2016 16:12 Chris_Rands

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

Mantenga sety 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([])
kiriloff avatar May 13 '2013 02:05 kiriloff
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)
Fardin Abdi avatar Nov 29 '2017 16:11 Fardin Abdi