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

Résolu
DOUDOU#9 -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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
    1. DOUDOU#9
       
      parfait ça marche!
      merci infiniment pour votre réponse.
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
    1. DOUDOU#9
       
      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
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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