J'ai un problème avec la création d'une liste de liste et la fonction shuffle [Résolu]

Signaler
-
Messages postés
1069
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
7 juin 2021
-
Bonjour,

Comme expliqué dans le titre j'essai de faire une liste avec toutes les combinaisons possibles d'une liste de 19 chiffres numérotés de 1 à 19 avec la fonction shuffle du module random sauf que lorsque j'ajoute une sous-liste avec append toutes les sous-listes sont actualisées...
Voici le code en question et le résultat ci dessous:

import random as rd

liste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
liste_z = []


for i in range(10):
rd.shuffle(liste)
liste_z.append(liste)

print(liste_z)


[[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8],
[16, 11, 18, 15, 10, 19, 7, 14, 6, 5, 2, 3, 9, 13, 17, 1, 12, 4, 8]]

Merci beaucoup pour votre attention, j'espère que ce problème n'est pas juste un beug...

3 réponses

Messages postés
1069
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
7 juin 2021
120
Bonjour,

Tout se passe comme si la liste ajoutée à liste_z n'était pas une copie de liste, mais liste
elle-même

Donc, quand on refait rd.shuffle(liste), on modifie aussi dans liste_z

Moi je ferais une copie de liste avant de mélanger (shuffle):

liste_z=[]
li=liste.copy()
random.shuffle(li)
liste_z.append(li)
parfait ça marche!
merci infiniment pour votre réponse.
Messages postés
15962
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
il est possible aussi, dans l'instruction append, d'insérer une copie de la liste plutôt qu'une référence à la liste:
for i in range(10):
    rd.shuffle(liste)
    liste_z.append(liste[:])
Messages postés
15962
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
bonjour,
c'est un bug dans ton programme, en effet.
tu crées une liste, liste_z, dans laquelle tu mets 10 références vers la même liste.
ajoute
print(liste_z)
dans ta boucle, cela t'aidera à comprendre.
Messages postés
15962
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
j'avais essayé et en effet je voyais que ça réactualisais toute la liste mais ça ne m'a pas aidé à résoudre le problème.
merci pour votre réponse en tout cas
Messages postés
1069
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
7 juin 2021
120
En tout cas, si tu fais comme je te l'indique dans mon message de 11h14,

ca résout le problème

(copie de la liste avant shuffle)