Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mélange de plusieurs listes dans le même ordre

Sujet résolu
    16 mai 2014 à 14:58:20

    Bonjour, je voudrais savoir comment faire pour faire un random.shuffle de toutes ces listes de façon à ce qu'elles restent en correspondance ? (Car il s'agit d'un QCM) Il y aurai bien la méthode du dictionnaire mais je ne la comprend hélas pas :(

    question=["Combien il y a-t-il de Beatles ?","En quelle annee est mort Kurt Cobain ?","Qui est le leader des Doors ?"]
    rep1=["3","1991","Jim Morrison"]
    rep2=["4","1992","Robert Plant"]
    rep3=["5","1994","Freddie Mercury"]
    rep4=["6","1995","Kurt Cobain"]
    ok=[rep2[x],rep3[x],rep1[x]]

    Merci d'avance :)

    -
    Edité par corentinthib 16 mai 2014 à 16:08:13

    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2014 à 15:38:46

      Tu peux créer une nouvelle liste qui sera mélangée, en gardant l'ancienne:

      nouvelle_liste = list(ancienne_liste)
      random.shuffle(nouvelle_liste)

      Ensuite tu utilise la méthode index() pour récupérer la position de la question dans l'ancienne liste:

      for question in nouvelle_liste:
          position = ancienne_liste.index(question)
          print(reponse1[position], reponse2[position])

      Bien sûr ce n'est qu'un exemple qu'il te faut adapter à ton code.




      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        16 mai 2014 à 17:11:15

        Pourquoi avoir modélisé tes questions sous cette forme plutôt que par une liste de tuples ?

        [
            (question, rep1, rep2, rep3, rep4, bonne_reponse),
            (question, rep1, rep2, rep3, rep4, bonne_reponse),
            # ...
        ]
        

        -
        Edité par nohar 16 mai 2014 à 17:11:26

        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          17 mai 2014 à 13:23:35

          Merci bien Olygrim ! Ta méthode m'a l'air efficace, mais je dois avouer avoir du mal à adapter cela à mon code ^^'

          Effectivement nohar, cela semble pratique... mais le problème c'est que cette méthode implique une modification quasi-totale du système de validation des réponse, et s'agissant d'un projet noté et à rendre le jeudi 22, je n'ai pas trop le temps ^^' Et de plus mon niveau en python est trop faible pour tout refaire rapidement hélas :/

          • Partager sur Facebook
          • Partager sur Twitter
            17 mai 2014 à 14:46:18

            "Pas trop le temps" ?

            Il suffit d'utiliser la fonction zip :

            >>> import random
            >>> quest = list(zip(question, rep1, rep2, rep3, rep4, ok))
            >>> random.shuffle(quest)
            >>> quest
            [('Qui est le leader des Doors ?', 'Jim Morrison', 'Robert Plant', 'Freddie Mercury', 'Kurt Cobain', 1), ('En quelle annee est mort Kurt Cobain ?', '1991', '1992', '1994', '1995', 3), ('Combien il y a-t-il de Beatles ?', '3', '4', '5', '6', 2)]
            >>> question, rep1, rep2, rep3, rep4, ok = tuple(zip(*quest))
            >>> question
            ('Qui est le leader des Doors ?', 'En quelle annee est mort Kurt Cobain ?', 'Combien il y a-t-il de Beatles ?')
            >>> rep1
            ('Jim Morrison', '1991', '3')
            >>> rep2
            ('Robert Plant', '1992', '4')
            >>> rep3
            ('Freddie Mercury', '1994', '5')
            >>> rep4
            ('Kurt Cobain', '1995', '6')
            >>> ok
            (1, 3, 2)
            

            En gros, tu peux passer de l'un à l'autre en une ligne de code, et c'est N fois plus efficace que la méthode d'Olygrim, avec N le nombre de questions.

            Si c'est ça que tu appelles une "modification quasi-totale du système de validation des réponses"...

            -
            Edité par nohar 17 mai 2014 à 15:00:40

            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              17 mai 2014 à 16:03:12

              Super merci ça fonctionne !!! Juste, le "tuple(zip(*quest))" ça sert à "dézipper" c'est ça ? Et encore merci ! :D

              -
              Edité par corentinthib 17 mai 2014 à 16:11:55

              • Partager sur Facebook
              • Partager sur Twitter
                17 mai 2014 à 16:09:20

                C'est ça.

                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                Anonyme
                  17 mai 2014 à 16:10:50

                  Non, il me semble que ça sert à rassembler (si on parle bien de l'expression entière et non de *quest seul)

                  • les questions entre elles
                  • les 1ère réponses entre elles
                  • etc...

                  Avec des nombres, testé à l'interpréteur (habitude à prendre), ça donnerait

                  >>> quest = [(1, 2, 3), (4, 5, 6)]
                  >>> tuple(zip(*quest))
                  ((1, 4), (2, 5), (3, 6))
                  

                  Si on parle de l'expression *quest seul, dans ce cas, en quelque sorte on ressort les éléments de la liste (genre d'extraction ou dézippage en effet)

                  >>> quest = [(1, 2, 3), (4, 5, 6)]
                  >>> print(*quest)
                  (1, 2, 3) (4, 5, 6)
                  

                  -
                  Edité par Anonyme 17 mai 2014 à 16:31:50

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    17 mai 2014 à 16:27:27

                    D'ici le 22 tu as largement le temps de reprendre ton exercice depuis le début ! Pourquoi tu ne veux pas adopter la structure de données proposée par nohar ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 mai 2014 à 16:51:56

                      Si par dézipper on entend faire l'opération inverse de :

                      zipped = list(zip(a, b, c))
                      

                      Alors c'est bel et bien :

                      a, b, c = tuple(zip(*zipped))
                      

                      C'est un bon idiomatisme à retenir.

                      -
                      Edité par nohar 17 mai 2014 à 16:55:54

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                        17 mai 2014 à 17:16:00

                        J'ai fait la méthode de nohar et elle parfaitement en adéquation avec ce que je voulais faire  psycopy ! ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 mai 2014 à 19:37:08

                          corentinthib a écrit:

                          J'ai fait la méthode de nohar et elle parfaitement en adéquation avec ce que je voulais faire  psycopy ! ;)

                          Non mais ce qu'on essaye de t'expliquer c'est que zip n'est qu'une demi-solution. En fait, rien ne justifie d'utiliser ta modélisation (une liste pour toutes les questions, une liste pour toutes les premières réponses etc.) : toutes les opérations possibles et imaginables sont plus simples en partant de la version zippée (chaque question est associée à ses réponses, donc totalement indépendante des autres), y compris l'ajout de nouvelles questions dans ton programme.

                          Je suis d'accord avec psycopy dans le sens où tu ne mettrais pas longtemps à recoder le moteur de ton jeu en partant directement de ce modèle (2h max), et ça aurait le mérite de rendre ton programme à la fois plus simple à comprendre, plus rapide à coder, et plus robuste aux bugs.

                          Une bonne modélisation, c'est ce qui fait la différence entre un programme élégant qui s'exprime naturellement et un code qui sent la sueur.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            17 mai 2014 à 22:19:21

                            J'ai fais ça, et je viens de me rendre compte que la liste ok était bien mélangée comme toutes les autres... Mais au lieu de piocher dans rep1, 2, 3 et 4 version mélangée, ok pioche dans l'ancienne... pourquoi ?

                            quest=list(zip(question, rep1, rep2, rep3, rep4, ok))
                            random.shuffle(quest)
                            question, rep1, rep2, rep3, rep4, ok = tuple(zip(*quest))
                            print(ok)



                            -
                            Edité par corentinthib 17 mai 2014 à 22:19:56

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              17 mai 2014 à 23:19:54

                              Je comprends pas la question...

                              En tout cas, si tu avais adopté une structure de données dans ce genre :

                              from random import shuffle
                              
                              QUESTIONS = [
                                  # ("question", "bonne réponse", "réponse 1", "réponse 2", "réponse n", etc..., ),
                                  ('Combien il y a-t-il de Beatles ?', '4', '3', '4', '5'),
                                  ('En quelle annee est mort Kurt Cobain ?', '1994', '1991', '1992', '1994', '1995', '1997'),
                                  ('Qui est le leader des Doors ?', 'Jim Morrison', 'Robert Plant', 'Freddie Mercury', 'Kurt Cobain', 'Jim Morrison'),
                                  # etc...
                              ]
                              
                              shuffle(QUESTIONS) # Mélanger les questions.
                              

                              Le problème ne se serait jamais posé.

                              Comme tu peux voir, le premier élément de chaque tuple est la question, le second la bonne réponse, et tous les suivants sont des choix possibles. À partir de ça, il est très simple de manipuler les données, d'en ajouter, d'en enlever, de changer uniquement les réponses possibles ou même de ne pas donner de choix, etc...

                              Et l'utilisation est très simple ; par exemple en console :

                              for question in QUESTIONS:
                                  print(question[0])
                                  for reponse in question[2:]:
                                      print("   -", reponse)
                                  if input("Votre réponse : ").lower() == question[1].lower():
                                      print("Bonne réponse !")
                                  else:
                                      print("Perdu ! La bonne réponse était :", question[1])
                              

                              -
                              Edité par Anonyme 17 mai 2014 à 23:28:45

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 mai 2014 à 1:27:22

                                Super ça fonctionne ! Merci !
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Mélange de plusieurs listes dans le même ordre

                                × 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