2009-06-20 17 views
67

Recibo como entrada una lista de cadenas y necesito devolver una lista con estas mismas cadenas pero en orden aleatorio. Debo permitir duplicados: la misma cadena puede aparecer una o más veces en la entrada y debe aparecer la misma cantidad de veces en la salida.La mejor manera de aleatorizar una lista de cadenas en Python

Veo varias formas de "fuerza bruta" de hacer eso (usando bucles, no lo quiera), uno de los cuales estoy usando actualmente. Sin embargo, conociendo a Python, probablemente haya un buen trazador de líneas que haga el trabajo, ¿verdad?

+0

duplicado posible de [Arrastrando una lista de objetos en Python] (http://stackoverflow.com/questions/ 976882/shuffling-a-list-of-objects-in-python) –

Respuesta

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 (rango (5)) .. no parece para trabajar con la lista generada sobre la marcha :( – user1019129

+6

@ user1019129 'random.shuffle' baraja listas en su lugar. En Python 3,' range (5) 'es un generador, no una lista. En Python 2,' range (5) 'es una lista, bu t la reproducción aleatoria está en su lugar, por lo que mezcla una lista temporal que se desecha inmediatamente. Puedes hacer 'x = rango (5); random.shuffle (x) 'y luego use' x'. –

3

Vas a tener que leer las cadenas en una matriz y luego usar una algoritmo de mezcla. Recomiendo Fisher-Yates shuffle

+0

Basado en un vistazo al artículo de Wikipedia, parece que eso es más o menos lo que está haciendo de todos modos. Puede leer el código en C: \ Python26 \ Lib \ random.py (o equivalente para otros sistemas operativos) y parece que está haciendo lo mismo que se describe aquí: http://en.wikipedia.org/wiki/Fisher%E2 % 80% 93Yates_shuffle # Modern_method – MatrixFrog

4

Dado un elemento cadena, que aquí hay una sola línea:

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