Baralhar elementos de uma lista em Python

O negócio

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.

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.

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]
Copied title and URL