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

Résolu/Fermé
DOUDOU#9 - 31 mai 2021 à 10:54
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 31 mai 2021 à 13:18
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

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 31 mai 2021 à 11:15
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)
0
parfait ça marche!
merci infiniment pour votre réponse.
0
yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
31 mai 2021 à 12:49
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[:])
0
yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
Modifié le 31 mai 2021 à 11:20
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.
0
yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
31 mai 2021 à 11:20
0
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
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
31 mai 2021 à 13:18
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)
0