2009-06-20 15 views
67

Ricevo come input un elenco di stringhe e ho bisogno di restituire un elenco con le stesse stringhe ma in ordine casuale. Devo consentire duplicati - la stessa stringa può apparire una o più volte nell'input e deve apparire lo stesso numero di volte nell'output.Il modo migliore per randomizzare un elenco di stringhe in Python

Vedo diversi modi di "forza bruta" per farlo (usando loop, dio non voglia), uno dei quali sto attualmente usando. Tuttavia, conoscendo Python c'è probabilmente un one-liner cool, fare il lavoro, giusto?

+0

Eventuali duplicati di [Mescolare un elenco di oggetti in pitone] (http://stackoverflow.com/questions/ 976882/shuffling-a-list-of-objects-in-python) –

risposta

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 (intervallo (5)) .. non sembra per lavorare con la lista generata al volo :( – user1019129

+6

@ user1019129 'random.shuffle' shuffle liste in place.In Python 3,' range (5) 'è un generatore, non una lista. In Python 2,' range (5) 'è una lista, bu t lo shuffle è a posto, quindi mischia una lista temporanea che viene immediatamente gettato via. Puoi fare 'x = range (5); random.shuffle (x) 'e quindi usa' x'. –

3

Dovrete leggere le stringhe in un array e quindi utilizzare un algoritmo di shuffling. Vi consiglio Fisher-Yates shuffle

+0

Basandosi su uno sguardo all'articolo di Wikipedia, sembra che sia più o meno quello che sta facendo comunque. Puoi leggere il codice in C: \ Python26 \ Lib \ random.py (o equivalente per altri sistemi operativi) e sembra che stia facendo la stessa cosa descritta qui: http://en.wikipedia.org/wiki/Fisher%E2 % 80% 93Yates_shuffle # Modern_method – MatrixFrog

4

Data una stringa oggetto, ecco una battuta:

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