for - using random in python
Python random shuffle while loop (2)
Intento llenar listas con permutaciones de la misma lista inicial. No entiendo por qué lo siguiente no está funcionando.
parts = [[],[]]
while len(parts[-1]) < 2:
newval = random.choice([[1,2,3,4],[5,6,7,8]])
for part in parts:
random.shuffle(newval)
part.append(newval)
El resultado esperado sería algo así como: [[[6,7,8,5],[1,3,4,2]],[[5,8,6,7],[4,2,3,1]]]
Porque en Python todo es referencia. Cuando agrega el valor a la matriz, de hecho agrega la referencia al lugar en la memoria donde se almacena el valor.
Diga, ha asignado la lista al primer elemento. Cuando en la próxima iteración vuelva a mezclar esta lista, cambie el valor en la memoria. Por lo tanto, el valor que tendrá cuando acceda al elemento que agregó en el paso anterior también cambiará.
Para solucionarlo, intente copy.copy(newval)
lugar de newval
(no olvide import copy
)
Aquí está su código cambiado en consecuencia:
import copy
parts = [[],[]]
while len(parts[-1]) < 2:
newval = random.choice([[1,2,3,4],[5,6,7,8]])
for part in parts:
random.shuffle(newval)
part.append(copy.copy(newval))
random.shuffle
funciona in situ y, en consecuencia, modifica newval
. Tiene que hacer una copia al anexarla a la part
contrario, la misma lista (o referencia de lista) se baraja y se almacena en part
.
import random
parts = [[],[]]
while len(parts[-1]) < 2:
newval = random.choice([[1,2,3,4],[5,6,7,8]])
for part in parts:
random.shuffle(newval)
part.append(newval[:])
print(parts)
posibles resultados:
[[[3, 1, 2, 4], [5, 7, 6, 8]], [[1, 2, 4, 3], [6, 7, 5, 8]]]
[[[1, 3, 2, 4], [4, 2, 1, 3]], [[2, 4, 3, 1], [4, 3, 2, 1]]]
[[[7, 5, 6, 8], [3, 2, 4, 1]], [[8, 5, 6, 7], [1, 4, 3, 2]]]