2009-06-20 14 views
67

Je reçois en entrée une liste de chaînes et ai besoin de retourner une liste avec ces mêmes chaînes mais dans un ordre aléatoire. Je dois autoriser les doublons - la même chaîne peut apparaître une ou plusieurs fois dans l'entrée et doit apparaître le même nombre de fois dans la sortie.Meilleure façon de randomiser une liste de chaînes en Python

Je vois plusieurs méthodes de "force brute" de faire cela (en utilisant des boucles, Dieu m'en garde), dont je suis actuellement en train d'utiliser. Cependant, sachant Python, il y a probablement un cool one-liner qui fait le travail, n'est-ce pas?

+0

double possible de [Traînant une liste d'objets en python] (http://stackoverflow.com/questions/ 976882/shuffling-a-list-of-objects-in-python) –

Répondre

175
>>> import random 
>>> x = [1, 2, 3, 4, 3, 4] 
>>> random.shuffle(x) 
>>> x 
[4, 4, 3, 1, 2, 3] 
>>> random.shuffle(x) 
>>> x 
[3, 4, 2, 1, 3, 4] 
+1

random.shuffle (range (5)) .. ne semble pas pour travailler avec la liste générée à la volée :( – user1019129

+6

@ user1019129 'random.shuffle' remet les listes en place En Python 3,' range (5) 'est un générateur, pas une liste En Python 2,' range (5) 'est une liste, bu t le shuffle est en place, donc il mélange une liste temporaire qui est immédiatement jetée. Vous pouvez faire 'x = range (5); random.shuffle (x) ', puis utilisez' x'. –

3

Vous devrez lire les chaînes dans un tableau, puis utiliser un algorithme de brassage. Je recommande Fisher-Yates shuffle

+0

Basé sur un coup d'oeil à l'article de Wikipédia, on dirait que c'est plus ou moins ce qu'il fait de toute façon. Vous pouvez lire le code dans C: \ Python26 \ Lib \ random.py (ou équivalent pour les autres systèmes d'exploitation) et on dirait qu'il fait la même chose que celle décrite ici: http://en.wikipedia.org/wiki/Fisher%E2 % 80% 93Yates_shuffle # Moderne_méthode – MatrixFrog

4

d'une chaîne élément, voici un one-liner:

''.join([str(w) for w in random.sample(item, len(item))]) 
Questions connexes