una numero mezclar llenar listas lista generar elegir desordenar como azar aleatorios aleatorias aleatoria python

numero - aleatorizar dos listas y mantener el orden en python



mezclar una lista python (6)

Combinaría las dos listas, mezclaría la lista resultante y luego los dividiría. Esto hace uso de zip()

a = ["Spears", "Adele", "NDubz", "Nicole", "Cristina"] b = [1, 2, 3, 4, 5] combined = list(zip(a, b)) random.shuffle(combined) a[:], b[:] = zip(*combined)

Digamos que tengo dos listas simples

a = [''Spears'', "Adele", "NDubz", "Nicole", "Cristina"] b = [1,2,3,4,5] len(a) == len(b)

Lo que me gustaría hacer es aleatorizar a y b pero mantener el orden. Entonces, algo como:

a = ["Adele", ''Spears'', "Nicole", "Cristina", "NDubz"] b = [2,1,4,5,3]

Soy consciente de que puedo barajar una lista usando:

import random random.shuffle(a)

Pero esto simplemente aleatoriza a , mientras que, me gustaría aleatorizar a , y mantener el "orden aleatorio" en la lista b .

Agradecería cualquier orientación sobre cómo se puede lograr esto.


Esa es mi manera:

import random def shuffleTogether(A, B): if len(A) != len(B): raise Exception("Lengths don''t match") indexes = range(len(A)) random.shuffle(indexes) A_shuffled = [A[i] for i in indexes] B_shuffled = [B[i] for i in indexes] return A_shuffled, B_shuffled A = [''a'', ''b'', ''c'', ''d''] B = [''1'', ''2'', ''3'', ''4''] A_shuffled, B_shuffled = shuffleTogether(A, B) print A_shuffled print B_shuffled


Otra forma podría ser

a = [''Spears'', "Adele", "NDubz", "Nicole", "Cristina"] b = range(len(a)) # -> [0, 1, 2, 3, 4] b_alternative = range(1, len(a) + 1) # -> [1, 2, 3, 4, 5] random.shuffle(b) a_shuffled = [a[i] for i in b] # or: a_shuffled = [a[i - 1] for i in b_alternative]

Es el enfoque inverso, pero podría ayudarte sin embargo.


Para evitar reinventar la rueda, use sklearn

from sklearn.utils import shuffle a, b = shuffle(a, b)


Tenga en cuenta que la respuesta de Tim solo funciona en Python 2, no en Python 3. Si usa Python 3, debe hacer lo siguiente:

combined = list(zip(a, b)) random.shuffle(combined) a[:], b[:] = zip(*combined)

de lo contrario, obtendrá el error:

TypeError: object of type ''zip'' has no len()


Utilice zip que tiene la característica agradable para trabajar de ''ambas formas''.

import random a = [''Spears'', "Adele", "NDubz", "Nicole", "Cristina"] b = [1,2,3,4,5] z = zip(a, b) # => [(''Spears'', 1), (''Adele'', 2), (''NDubz'', 3), (''Nicole'', 4), (''Cristina'', 5)] random.shuffle(z) a, b = zip(*z)