Si quieres barajar (ordenar aleatoriamente) los elementos de una lista (array) en Python, utiliza el módulo random de la biblioteca estándar.
Hay dos funciones: shuffle(), que ordena aleatoriamente la lista original, y sample(), que devuelve una nueva lista ordenada aleatoriamente. sample() puede utilizarse para cadenas y tuplas.
- Barajar la lista original:
random.shuffle()
- Generar una nueva lista barajada.:
random.sample()
- Mezclar cadenas y tuplas
- Fijar la semilla de números aleatorios
Si desea clasificar en orden ascendente o descendente en lugar de aleatorio, o en orden inverso, consulte el siguiente artículo.
- Artículos relacionados:Ordenar una lista en Python: la diferencia entre ordenada y clasificada
Barajar la lista original: random.shuffle()
La función shuffle() del módulo random puede ordenar aleatoriamente la lista original.
import random
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]
Generar una nueva lista barajada.: random.sample()
La función sample() del módulo random puede utilizarse para crear una nueva lista ordenada aleatoriamente, sin cambiar la lista original.
sample() es una función que selecciona y recupera aleatoriamente un elemento de una lista. El primer argumento es una lista, y el segundo es el número de elementos a recuperar. Consulte el siguiente artículo para obtener más detalles.
- Artículos relacionados:Seleccionar al azar elementos de una lista en Python:
choice()
,sample()
,choices()
Si el número de elementos a seleccionar por sample() es el número total de elementos de la lista, obtenemos una nueva lista con todos los elementos ordenados aleatoriamente. El número total de elementos de la lista se obtiene mediante len().
El objeto original no se modificará.
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
lr = random.sample(l, len(l))
print(lr)
# [0, 3, 1, 4, 2]
print(l)
# [0, 1, 2, 3, 4]
Mezclar cadenas y tuplas
Las cadenas y las tuplas son inmutables, por lo que si utilizas random.shuffle() para cambiar el objeto original, obtendrás el siguiente error.TypeError
s = 'abcde'
# random.shuffle(s)
# TypeError: 'str' object does not support item assignment
t = tuple(range(5))
print(t)
# (0, 1, 2, 3, 4)
# random.shuffle(t)
# TypeError: 'tuple' object does not support item assignment
Si quieres barajar una cadena o tupla, utiliza random.sample(), que crea un nuevo objeto.
Incluso cuando se especifica una cadena o tupla como argumento, random.sample() devuelve una lista, por lo que es necesario procesarla de nuevo a una cadena o tupla.
En el caso de una cadena, será una lista de caracteres uno a uno. Para concatenarlos de nuevo en una sola cadena, utiliza el método join().
sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca
Para las tuplas, utilice tuple(), que crea una tupla a partir de una lista.
tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)
Fijar la semilla de números aleatorios
Dando un número entero arbitrario a la función seed() del módulo random, la semilla de números aleatorios puede ser fijada y el generador de números aleatorios puede ser inicializado.
Después de la inicialización con la misma semilla, siempre se reordena de la misma manera.
l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]
l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]