Barreja elements en una llista en Python

Negocis

Si voleu barrejar (ordenar aleatòriament) els elements d’una llista (matriu) a Python, utilitzeu el mòdul aleatori de la biblioteca estàndard.

Hi ha dues funcions: shuffle(), que ordena aleatòriament la llista original, i sample(), que retorna una nova llista ordenada aleatòriament. sample() es pot utilitzar per a cadenes i tuples.

  • Barreja la llista original:random.shuffle()
  • Genereu una llista nova i barrejada.:random.sample()
  • Barreja cordes i tuples
  • Corregiu la llavor del nombre aleatori

Si voleu ordenar en ordre ascendent o descendent en lloc d’atzar, o en ordre invers, consulteu l’article següent.

Barreja la llista original:random.shuffle()

La funció shuffle() del mòdul aleatori pot ordenar aleatòriament la llista original.

import random

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]

Genereu una llista nova i barrejada.:random.sample()

La funció sample() del mòdul aleatori es pot utilitzar per crear una llista nova que s’ordena aleatòriament, sense canviar la llista original.

sample() és una funció que selecciona i recupera aleatòriament un element d’una llista. El primer argument és una llista i el segon argument és el nombre d’elements que cal recuperar. Consulteu l’article següent per obtenir més informació.

Si el nombre d’elements a seleccionar per sample() és el nombre total d’elements de la llista, obtenim una llista nova amb tots els elements ordenats aleatòriament. El nombre total d’elements de la llista s’obté per len().

L’objecte original no es canviarà.

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]

Barreja cordes i tuples

Les cadenes i les tuples són immutables, de manera que si feu servir random.shuffle() per canviar l’objecte original, obtindreu el següent 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 voleu barrejar una cadena o una tupla, utilitzeu random.sample(), que crea un objecte nou.

Fins i tot quan s’especifica una cadena o una tupla com a argument, random.sample() retorna una llista, de manera que cal tornar-la a processar a una cadena o tupla.

En el cas d’una cadena, serà una llista de caràcters un per un. Per tornar-los a concatenar en una única cadena, utilitzeu el mètode join().

sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca

Per a tuples, utilitzeu tuple(), que crea una tupla a partir d’una llista.

tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)

Corregiu la llavor del nombre aleatori

En donar un nombre enter arbitrari a la funció seed() del mòdul aleatori, es pot arreglar la llavor de nombres aleatoris i es pot inicialitzar el generador de números aleatoris.

Després de la inicialització amb la mateixa llavor, sempre es reordena de la mateixa 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]