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.
- Articles relacionats:Ordenar una llista en Python: la diferència entre ordenada i ordenada
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ó.
- Articles relacionats:Seleccioneu aleatòriament elements d’una llista a Python:
choice()
,sample()
,choices()
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]