Mischiare elementi in una lista in Python

Attività commerciale

Se volete mescolare (ordinare in modo casuale) gli elementi di una lista (array) in Python, usate il modulo random della libreria standard.

Ci sono due funzioni: shuffle(), che ordina in modo casuale la lista originale, e sample(), che restituisce una nuova lista ordinata in modo casuale. sample() può essere usata per stringhe e tuple.

  • Mescolare la lista originale:random.shuffle()
  • Genera una nuova lista mischiata.:random.sample()
  • Mischiare stringhe e tuple
  • Fissare il seme del numero casuale

Se vuoi ordinare in ordine crescente o decrescente invece che casuale, o in ordine inverso, vedi il seguente articolo.

Mescolare la lista originale: random.shuffle()

La funzione shuffle() nel modulo random può ordinare in modo casuale la lista originale.

import random

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

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

Genera una nuova lista mischiata.: random.sample()

La funzione sample() nel modulo random può essere usata per creare una nuova lista ordinata in modo casuale, senza cambiare la lista originale.

sample() è una funzione che seleziona e recupera casualmente un elemento da una lista. Il primo argomento è una lista e il secondo argomento è il numero di elementi da recuperare. Vedi il seguente articolo per i dettagli.

Se il numero di elementi da selezionare con sample() è il numero totale di elementi nella lista, si ottiene una nuova lista con tutti gli elementi ordinati in modo casuale. Il numero totale di elementi nella lista si ottiene con len().

L'oggetto originale non verrà modificato.

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]

Mischiare stringhe e tuple

Stringhe e tuple sono immutabili, quindi se usate random.shuffle() per cambiare l'oggetto originale, otterrete il seguente errore.
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 volete mischiare una stringa o una tupla, usate random.sample(), che crea un nuovo oggetto.

Anche quando una stringa o una tupla è specificata come argomento, random.sample() restituisce una lista, quindi è necessario rielaborarla in una stringa o tupla.

Nel caso di una stringa, sarà una lista di caratteri uno per uno. Per concatenarli di nuovo in un'unica stringa, usate il metodo join().

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

Per le tuple, usate tuple(), che crea una tupla da una lista.

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

Fissare il seme del numero casuale

Dando un numero intero arbitrario alla funzione seed() del modulo random, il seme del numero casuale può essere fissato e il generatore di numeri casuali può essere inizializzato.

Dopo l'inizializzazione con lo stesso seme, viene sempre riordinato allo stesso modo.

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]