Cómo seleccionar aleatoriamente elementos de una lista en Python

En este artículo, veremos *cómo seleccionar aleatoriamente elementos de una lista en Python*, tanto elementos aleatorios singulares como elementos múltiples, con y sin repetición.

Introducción

Seleccionar un elemento o valor aleatorio de una lista es una tarea común, ya sea para un resultado aleatorio de una lista de recomendaciones o simplemente para un mensaje aleatorio.

En este artículo, veremos cómo seleccionar aleatoriamente elementos de una lista en Python. Cubriremos la recuperación de elementos aleatorios singulares, así como la recuperación de elementos múltiples, con y sin repetición.

Selección de un elemento aleatorio de la lista de Python

El enfoque más intuitivo y natural para resolver este problema es generar un número aleatorio que actúe como índice para acceder a un elemento de la lista.

Para implementar este enfoque, veamos algunos métodos para generar números aleatorios en Python: random.randint() y random.randrange(). Además, podemos usar random.choice() y proporcionar un iterable, lo que da como resultado que se devuelva un elemento aleatorio de ese iterable.

Usando random.randint()

random.randint(a, b) devuelve un número entero aleatorio entre a y b inclusive.

Querremos un índice aleatorio en el rango de 0 a len(list)-1, para obtener un índice aleatorio de un elemento en la lista:

1
2
3
4
5
6
import random

letters = ['a', 'b', 'c', 'd', 'e', 'f']
random_index = random.randint(0,len(letters)-1)

print(letters[random_index])

Ejecutar este código varias veces nos da:

1
2
3
4
e
c
f
a

Usando random.randrange()

random.randrange(a) es otro método que devuelve un número aleatorio n tal que 0 <= n < a:

1
2
3
4
5
6
import random

letters = ['a', 'b', 'c', 'd', 'e', 'f']
random_index = random.randrange(len(letters))

print(letters[random_index])

Ejecutar este código varias veces producirá algo similar a:

1
2
3
4
f
d
d
e

Como random.randrange(len(letras)) devuelve un número generado aleatoriamente en el rango 0 a len(letras) - 1, lo usamos para acceder a un elemento al azar en letras, al igual que hizo en el enfoque anterior.

Este enfoque es un poco más simple que el anterior, simplemente porque no especificamos el punto de partida, que por defecto es 0.

Usando random.choice()

Ahora, una solución aún mejor que la anterior sería usar random.choice() ya que esta es precisamente la función diseñada para resolver este problema:

1
2
3
4
5
import random 

letters = ['a', 'b', 'c', 'd', 'e', 'f']

print(random.choice(letters))

Ejecutar esto varias veces da como resultado:

1
2
3
4
5
b
e
e
f
e

Selección de más de un elemento aleatorio de la lista de Python

Usando random.sample()

El primer método que podemos utilizar para seleccionar más de un elemento al azar es random.sample(). Produce una muestra, según la cantidad de muestras que nos gustaría observar:

1
2
3
4
5
import random 

letters = ['a', 'b', 'c', 'd', 'e', 'f']

print(random.sample(letters, 3))

Esto devuelve una lista:

1
['d', 'c', 'a']

Este método selecciona elementos sin reemplazo, es decir, selecciona sin duplicados y repeticiones.

Si ejecutamos esto:

1
print(random.sample(letters, len(letters)))

Como no devuelve duplicados, simplemente devolverá nuestra lista completa en un orden aleatorio:

1
['a', 'e', 'c', 'd', 'f', 'b']

Usando random.choices()

Similar a la función anterior, random.choices() devuelve una lista de elementos seleccionados al azar de un iterable dado. Sin embargo, no realiza un seguimiento de los elementos seleccionados, por lo que también puede obtener elementos duplicados:

1
2
3
4
5
import random 

letters = ['a', 'b', 'c', 'd', 'e', 'f']

print(random.choices(letters, k=3))

Esto devuelve algo como:

1
['e', 'f', 'f']

Además, si ejecutamos:

1
print(random.choices(letters, k = len(letters)))

Puede devolver algo como:

1
['d', 'e', 'b', 'd', 'd', 'd']

random.choices devuelve una lista del tamaño de una k de elementos seleccionados al azar con reemplazo.

Este método también se puede usar para implementar elecciones aleatorias ponderadas que puede explorar más a fondo en la [documentación oficial de Python] (https://docs.python.org/3/library/random.html).

Selección de n elementos aleatorios sin repetición

Si está buscando crear colecciones aleatorias de n elementos, sin repeticiones, la tarea es aparentemente más compleja que las tareas anteriores, pero en la práctica, es bastante simple.

shuffle() la lista y la divides en n partes. Esto garantiza que no se agreguen elementos duplicados, ya que solo está cortando la lista y la hemos barajado para que las colecciones sean aleatorias.

If you'd like to read more about splitting a list into random chunks take a look at - Cómo dividir una lista en partes pares en Python.

Guardaremos el resultado en una nueva lista, y si no hay suficientes elementos para una colección final, simplemente quedará sin terminar:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import random

def select_random_Ns(lst, n):
    random.shuffle(lst)
    result = []
    for i in range(0, len(lst), n):
        result.append(lst[i:i + n])
    return result
        
        
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(select_random_Ns(lst, 2))

Esto da como resultado una lista de pares aleatorios, sin repetición:

1
[[8, 6], [3, 4], [5, 7], [9, 1], [2]]

Conclusión

En este artículo, hemos explorado varias formas de recuperar uno o varios elementos seleccionados al azar de una Lista en Python.

Hemos accedido a la lista en índices aleatorios usando randint() y randrange(), pero también obtuvimos elementos aleatorios usando choice() y sample().

Licensed under CC BY-NC-SA 4.0