Se quiser embaralhar (classificar aleatoriamente) os elementos de uma lista (array) em Python, utilize o módulo aleatório da biblioteca padrão.
Há duas funções: shuffle(), que ordena aleatoriamente a lista original, e sample(), que devolve uma nova lista ordenada aleatoriamente. sample() pode ser usada para cordas e tufos.
- Baralhar a lista original:
random.shuffle()
- Gerar uma nova lista baralhada.:
random.sample()
- Baralhar cordas e tufos
- Fixar o número aleatório de sementes
Se quiser ordenar por ordem ascendente ou descendente em vez de aleatória, ou em ordem inversa, ver o artigo seguinte.
- Artigos relacionados:Ordenar uma lista em Python: a diferença entre ordenado e ordenado
Baralhar a lista original: random.shuffle()
A função shuffle() no módulo aleatório pode ordenar a lista original de forma aleatória.
import random
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]
Gerar uma nova lista baralhada.: random.sample()
A função amostra() no módulo aleatório pode ser usada para criar uma nova lista que é classificada aleatoriamente, sem alterar a lista original.
amostra() é uma função que selecciona e recupera aleatoriamente um elemento de uma lista. O primeiro argumento é uma lista, e o segundo argumento é o número de elementos a serem recuperados. Ver o artigo seguinte para detalhes.
- Artigos relacionados:Seleccionar aleatoriamente elementos de uma lista em Python:
choice()
,sample()
,choices()
Se o número de elementos a seleccionar por amostra() for o número total de elementos da lista, obtemos uma nova lista com todos os elementos ordenados aleatoriamente. O número total de elementos da lista é obtido por len().
O objecto original não será alterado.
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]
Baralhar cordas e tufos
As cordas e os tufos são imutáveis, por isso se utilizar o random.shuffle() para alterar o objecto original, obterá 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 quiser baralhar uma corda ou tuple, use random.sample(), que cria um novo objecto.
Mesmo quando uma string ou tuple é especificada como argumento, random.sample() devolve uma lista, pelo que é necessário processá-la de volta para uma string ou tuple.
No caso de uma corda, será uma lista de caracteres um a um. Para os concatenar novamente numa única corda, utilizar o método join().
sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca
Para os tuplos, utilizar tuple(), que cria um tuple a partir de uma lista.
tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)
Fixar o número aleatório de sementes
Ao dar um inteiro arbitrário à função semente() do módulo aleatório, a semente do número aleatório pode ser fixada e o gerador de números aleatórios pode ser inicializado.
Após a inicialização com a mesma semente, é sempre reordenada da mesma forma.
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]