Partage
  • Partager sur Facebook
  • Partager sur Twitter

Etaler une liste sur plusieurs lignes

Sujet résolu
    20 juillet 2013 à 23:53:21

    Bonsoir. :)

    Pour m'entraîner je fais un petit jeu sur console qui se jouera sur une grille 10*10. Pour la simuler j'utilise une liste contenant 10 listes contenant chacune 10 éléments. Sauf que quand j'affiche la grande liste L, les lignes de la grille s'affichent côte à côte :

    [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

    Ce qui est très rebutant et gênant. :( N'est-il pas possible d'afficher une seule petite liste chaque ligne ? (Sans passer par le print(L[i],'\n'). Je voudrais que dès que je déclare la liste, celle-ci s'affiche automatiquement comme je l'ai décrite.)


    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2013 à 2:11:22

      MasterSilver a écrit:

      Je voudrais que dès que je déclare la liste, celle-ci s'affiche automatiquement comme je l'ai décrite

      C'est pas possible ça imho.

      Le plus simple est d'utiliser ta propre fonction en utilisant une boucle for. J'ai testé le module pprint et je suis pas certain que tu puisse obtenir ce que tu veux avec.

      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        21 juillet 2013 à 2:59:27

        Ah :/

        Eh bien je pense que je vais créer une fonction pour ça. ^^ Merci en tout cas.

        Mais j'ai rencontré un autre problème :

        for j in range(18):
            a,b=int(input()),int(input())
            L[a][b]=1

        Je demande à l'utilisateur de répartir les pièces sur la moitié de la grille (j'ai remplacé la 10*10 par une 6*6), sauf que quand j'affecte à L[a][b] la valeur 1, voici le résultat après avoir rentré 0 pour a et 1 pour b.

        [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]]

         Au lieu que ce soit uniquement L[0][1] qui devienne un 1, TOUTES les listes voient leurs deuxième élément remplacé... Pourquoi ? Je ne comprends pas. Merci d'avance. :)



        EDIT : Bon ben une autre solution m'est tombée sous la tête:

        for i in range(18):
            a,b=int(input()),int(input())
            l.append([a,b])
        
        L=list()
        
        
        for j in range(6):
            L.append([])
            for k in range(6):
                if [j,k] in l:
                    L[j].append(1)
                else:
                    L[j].append(0)

        Pas super pratique mais ça fonctionne :D Même si ça ne me ferait pas de mal de savoir pourquoi ma précédente ne fonctionne pas...

        -
        Edité par Hazzin 21 juillet 2013 à 3:11:03

        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2013 à 3:13:05

          Ça doit venir de ta façon de créer les listes, selon la façon de faire au lieu d'avoir plein de listes différentes tu as plein de références à la même liste, du coup en modifier une les modifie toutes.

          -
          Edité par LoupSolitaire 21 juillet 2013 à 3:13:24

          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            21 juillet 2013 à 3:26:46

            C'est vrai que quand je crée une liste je fais ce qui paraît intuitif directement... Merci en tout cas, je ferai plus attention. :D
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2013 à 3:41:10

              MasterSilver a écrit:

              Même si ça ne me ferait pas de mal de savoir pourquoi ma précédente ne fonctionne pas...

              Poste ton vrai code alors, parce que les trucs que tu as mis pour l'instant ne terminent pas.

              Tu devrais essayer de créer les listes avec list() au lieu de [], si je me rappelle bien ça aide.

              • Partager sur Facebook
              • Partager sur Twitter

              Blond, bouclé, toujours le sourire aux lèvres...

                21 juillet 2013 à 3:50:54

                Bah le précédent code consistait en la création de la liste + la première boucle for que j'ai posté ce qui donne :

                L=[[0]*6]*6
                
                for j in range(18):
                    a,b=int(input()),int(input())
                    L[a][b]=1
                

                -
                Edité par Hazzin 21 juillet 2013 à 3:52:11

                • Partager sur Facebook
                • Partager sur Twitter
                  21 juillet 2013 à 3:59:34

                  Ça tombe bien le problème vient de la ligne 1 :D

                  Quand tu fais ça, tu obtiens une liste qui contient 6 références vers la même liste.

                  Faut initialiser plutôt comme ça : [[0]*4 for i in range(4)]

                  Tu peux utiliser id() pour savoir si tu as un plusieurs fois le même objet ou des objets différents. Par exemple :

                  >>> map(id, [[0]*4 for i in range(4)])
                  [39398216, 39398576, 39398360, 39399080]
                  

                  Les id sont tous différents, donc ce sont bien des listes différentes.

                  Dans ton code ça donne ça :

                  >>> [id(x) for x in [0]*4]
                  [38440064, 38440064, 38440064, 38440064]
                  

                  id identiques : 4 références vers la même liste.

                  -
                  Edité par LoupSolitaire 21 juillet 2013 à 4:06:22

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Blond, bouclé, toujours le sourire aux lèvres...

                    21 juillet 2013 à 4:14:24

                    Cette erreur me bloquait depuis quelque temps sur plusieurs problèmes. Merci beaucoup !:D

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 juillet 2013 à 4:21:14

                      Si tu veux plus de précisions il y a un post très complet à ce sujet sur stackoverflow (en anglais) : http://stackoverflow.com/questions/2612802/how-to-clone-a-list-in-python

                      J'ai l'impression que tous ceux qui approfondissent python bloquent sur ce point à un moment.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Blond, bouclé, toujours le sourire aux lèvres...

                      Etaler une liste sur plusieurs lignes

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown