Mélanger les éléments d’une liste en Python

Affaires

Si vous souhaitez mélanger (trier au hasard) les éléments d'une liste (tableau) en Python, utilisez le module random de la bibliothèque standard.

Il existe deux fonctions : shuffle(), qui trie de manière aléatoire la liste originale, et sample(), qui renvoie une nouvelle liste triée de manière aléatoire. sample() peut être utilisé pour les chaînes de caractères et les tuples.

  • Mélanger la liste originale:random.shuffle()
  • Générer une nouvelle liste mélangée.:random.sample()
  • Mélange des chaînes et des tuples
  • Fixer la graine du nombre aléatoire

Si vous souhaitez effectuer un tri dans l'ordre croissant ou décroissant au lieu de l'ordre aléatoire, ou dans l'ordre inverse, consultez l'article suivant.

Mélanger la liste originale: random.shuffle()

La fonction shuffle() du module random permet de trier aléatoirement la liste originale.

import random

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

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

Générer une nouvelle liste mélangée.: random.sample()

La fonction sample() du module random peut être utilisée pour créer une nouvelle liste triée au hasard, sans modifier la liste d'origine.

sample() est une fonction qui sélectionne et récupère de manière aléatoire un élément d'une liste. Le premier argument est une liste, et le deuxième argument est le nombre d'éléments à extraire. Voir l'article suivant pour plus de détails.

Si le nombre d'éléments à sélectionner par sample() est le nombre total d'éléments dans la liste, on obtient une nouvelle liste avec tous les éléments triés aléatoirement. Le nombre total d'éléments dans la liste est obtenu par len().

L'objet original ne sera pas modifié.

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]

Mélange des chaînes et des tuples

Les chaînes et les tuples sont immuables, donc si vous utilisez random.shuffle() pour modifier l'objet original, vous obtiendrez l'erreur suivante.
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 vous voulez mélanger une chaîne ou un tuple, utilisez random.sample(), qui crée un nouvel objet.

Même lorsqu'une chaîne ou un tuple est spécifié comme argument, random.sample() renvoie une liste, il est donc nécessaire de la retraiter en une chaîne ou un tuple.

Dans le cas d'une chaîne de caractères, il s'agira d'une liste de caractères, un par un. Pour les concaténer à nouveau en une seule chaîne, utilisez la méthode join().

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

Pour les tuples, utilisez tuple(), qui crée un tuple à partir d'une liste.

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

Fixer la graine du nombre aléatoire

En donnant un nombre entier arbitraire à la fonction seed() du module random, la graine de nombre aléatoire peut être fixée et le générateur de nombre aléatoire peut être initialisé.

Après une initialisation avec la même graine, il est toujours réorganisé de la même manière.

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]