Obtención de valores de índice anteriores de una lista de elementos de python después de barajar

Digamos que tengo tal lista de python:

l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

utilizando random.shuffle ,

 >>> import random >>> random.shuffle(l) >>> l [5, 3, 2, 0, 8, 7, 9, 6, 4, 1] 

Estoy teniendo la lista anterior.

¿Cómo puedo obtener la lista de valores de índice anterior de cada elemento en la lista barajada?

Puede emparejar cada elemento con su índice utilizando enumerate , y luego barajar eso.

 >>> import random >>> l = [4, 8, 15, 16, 23, 42] >>> x = list(enumerate(l)) >>> random.shuffle(x) >>> indices, l = zip(*x) >>> l (4, 8, 15, 23, 42, 16) >>> indices (0, 1, 2, 4, 5, 3) 

Una ventaja de este enfoque es que funciona independientemente de si l contiene duplicados.

Si sus valores son únicos, solo use el método list.index . Por ejemplo, puedes hacer esto:

 import random l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] start_l = l[:] random.shuffle(l) for elem in l: print(elem, '->', start_l.index(elem)) 

Por supuesto, en su ejemplo, esto es trivial: cada elemento ya es su índice inicial.

 # gives the same result as above. l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] random.shuffle(l) for elem in l: print(elem, '->', elem) 

De hecho, el mejor método depende fuertemente de lo que quieras hacer. Si tiene otros datos, puede ser más simple simplemente mezclar índices, no datos. Esto evita cualquier problema de duplicación, etc. Básicamente, obtiene una lista de permutaciones, donde cada elemento es el índice al que se desplaza la posición. Por ejemplo, [2, 1, 0] es la permutación para revertir una lista.

 l = list(random.randint(0, 10) for _ in range(10)) l_idx = list(range(len(l))) # list of indices in l random.shuffle(l_idx) for new_idx, old_idx in enumerate(l_idx): print(l[old_idx], '@', old_idx, '->', new_idx) 

Para hacer un seguimiento de todo usando un diccionario, uno puede hacer esto:

Use enumerate en su comprensión del diccionario para tener índice y valor en su iteración, y luego asigne valor como clave e índice como valor.

 import random l = [5, 3, 2, 0, 8, 7, 9, 6, 4, 1] d = {v: i for i, v in enumerate(l)} print(d) # current state random.shuffle(l) 

La ventaja aquí es que obtiene O(1) búsqueda O(1) para recuperar su índice para cualquier valor que esté buscando.

Sin embargo, si su lista contendrá duplicados, debe referirse a esta respuesta de Kevin.

Crea una copia de la list original y baraja la copia:

 >>> import random >>> l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l_copy = list(l) # <-- Creating copy of the list >>> random.shuffle(l_copy) # <-- Shuffling the copy >>> l_copy # <-- Shuffled copy [8, 7, 1, 3, 6, 5, 9, 2, 0, 4] >>> l # <-- original list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> 

Una alternativa más intuitiva a las otras respuestas:

Mezcla un rango de índices, y úsalo para obtener una lista aleatoria de los valores originales.