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)