Barajar los elementos de una lista en Python

Negocio

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.

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.

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]