Se queres mesturar (ordenar aleatoriamente) os elementos dunha lista (matriz) en Python, utiliza o módulo aleatorio da biblioteca estándar.
Hai dúas funcións: shuffle(), que ordena aleatoriamente a lista orixinal, e sample(), que devolve unha nova lista aleatoria. sample() pódese usar para cadeas e tuplas.
- Baralla a lista orixinal:
random.shuffle()
- Xera unha nova lista barallada.:
random.sample()
- Baralla cordas e tuplas
- Corrixe a semente do número aleatorio
Se queres ordenar en orde ascendente ou descendente en lugar de aleatoria, ou en orde inversa, consulta o seguinte artigo.
- Artigos relacionados:Ordenar unha lista en Python: a diferenza entre ordenada e ordenada
Baralla a lista orixinal:random.shuffle()
A función shuffle() do módulo aleatorio pode ordenar aleatoriamente a lista orixinal.
import random
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]
Xera unha nova lista barallada.:random.sample()
A función sample() do módulo aleatorio pódese usar para crear unha nova lista que se ordene aleatoriamente, sen cambiar a lista orixinal.
sample() é unha función que selecciona e recupera aleatoriamente un elemento dunha lista. O primeiro argumento é unha lista e o segundo é o número de elementos que se van recuperar. Consulte o seguinte artigo para obter máis detalles.
- Artigos relacionados:Selecciona elementos aleatoriamente dunha lista en Python:
choice()
,sample()
,choices()
Se o número de elementos a seleccionar mediante sample() é o número total de elementos da lista, obtemos unha nova lista con todos os elementos ordenados aleatoriamente. O número total de elementos da lista obtense mediante len().
O obxecto orixinal non 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]
Baralla cordas e tuplas
As cadeas e as tuplas son inmutables, polo que se usas random.shuffle() para cambiar o obxecto orixinal, obterás o seguinte erro.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
Se queres mesturar unha cadea ou tupla, usa random.sample(), que crea un novo obxecto.
Mesmo cando se especifica unha cadea ou tupla como argumento, random.sample() devolve unha lista, polo que é necesario procesala de novo nunha cadea ou tupla.
No caso dunha cadea, será unha lista de caracteres un por un. Para concatenalos nunha única cadea de novo, use o método join().
sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca
Para as tuplas, use tuple(), que crea unha tupla a partir dunha lista.
tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)
Corrixe a semente do número aleatorio
Ao dar un número enteiro arbitrario á función seed() do módulo aleatorio, pódese corrixir a semente de números aleatorios e inicializar o xerador de números aleatorios.
Despois da inicialización coa mesma semente, sempre se reordena do mesmo xeito.
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]