Partage
  • Partager sur Facebook
  • Partager sur Twitter

Différences entre deux listes

Sujet résolu
    20 janvier 2020 à 23:48:01

    Bonjour à tous,

    Je cherche à comparer chaque élément dans une liste List1 aux éléments dans une deuxième liste List2. Le résultat renvoyé est une liste des différences entre les deux listes. Si l'élément est trouvé, j'arrête la boucle avec un break, sinon je continue à comparer avec les autres éléments de la liste List2.

    Je ne dois pas utiliser les méthodes "in" et not "in". Je dois pas non plus utiliser la récursivité.

    Par exemple 

    >>> differences([1,2,3,4,5,6], [6,4])

    [1,2,3,5,6]

    Pouvez-vous m'aider s'il vous plaît ?

    Je vous remercie d'avance pour votre aide ! 

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2020 à 1:14:31

      Peux-tu nous montrer un début de code ou une quelconque tentative sur tes travaux ?
      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        21 janvier 2020 à 18:44:48 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


          21 janvier 2020 à 18:54:00

          Bonjour,

          Merci de colorer votre code à l'aide du bouton Code

          Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: python;">Votre code ici</pre>.

          Liens conseillés

          • Partager sur Facebook
          • Partager sur Twitter
            21 janvier 2020 à 19:59:34

            Bonjour, j'ai programmé plusieurs fonctions pour résoudre ce problème, et voici celle que j'ai créé aujourd'hui. Elle ne renvoie pas le bon résultat. J'utilise la fonction "compare" qui est obligatoire.

            def compare(a,b):
            
                if a == b:
            
                    return 0
            
                elif a>b:
            
                    return 1
            
                else:
            
                    return -1
            
            def differences(l1,l2):
            
                # len(l2) est toujours strictement inférieur à len(l1)
            
                l=[]
            
                for i in range(len(l1)):
            
                    for j in range(len(l2)):
            
                        cmp = compare(l1[i], l2[j])
            
                        if cmp != 0:
            
                            l.append(l1[i])
            
                        else:
            
                            break
            
                return l </>



            -
            Edité par Ons Hamdi 21 janvier 2020 à 20:01:57

            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2020 à 20:42:42

              Je trouve cela bien compliqué,

              def differences(l1, l2):
                  l = []
                  detect = False
                  for n in l1:
                      if n not in l2 or detect:
                          l.append(n)
                      else:
                          detect = True
                  return l
              
              
              result = differences([1,2,3,4,5,6], [6,4])
              assert result == [1,2,3,5,6]
              print(result)

              Il faudrait faire d'autres tests pour vérifier que ça fait le café, mais c'est l'idée.

              Après on peut faire cela en une seule ligne mais j'ai peur de te perdre.

              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                21 janvier 2020 à 21:46:45

                Je vous remercie pour votre aide. Je sais comment résoudre mon problème avec la méthode 'in' et 'not in', or il est demandé dans mon exercice de programmer cette fonction mais sans utiliser ces méthodes.

                Chaque élément dans la liste 1 une doit être comparé à chaque élément dans la liste 2. Si on retrouve l'élément, on fait un break et on passe à l'élément suivant dans la liste un, et on refait les mêmes essaies, si on arrive au dernier élément de la liste 2 et qu'on le retrouve pas, alors on le rajoute dans la liste l. Les tests d'égalités doivent être fait avec la fonction 'compare'.

                Pourriez-vous m'aider à comprendre comment résoudre ce problème s'il vous plaît ? 

                Exemple avec differences([1,2,3,4], [3,4])

                1 == 3 ? => False #On ne rajoute pas d'élément dans la liste L car il reste un élément à tester dans la liste 2

                1 == 4 ? => False #Il ne reste plus d'élément à tester dans la liste 2, je rajoute donc le 1 à la liste L, l=[1]. On passe à l'élément suivant dans la liste 1

                2 == 3 ? => False, L = [1]

                2 == 4 ? = False, L=[1,2]

                3==3 ? True, break

                4 == 4 ? True, break

                #Tous les éléments dans la liste 1 sont testés. On renvoie L.

                Voilà le raisonnement qu'on doit suivre.

                • Partager sur Facebook
                • Partager sur Twitter
                  21 janvier 2020 à 23:40:47

                  hHhh7777 a écrit:

                  Exemple avec differences([1,2,3,4], [3,4])

                  1 == 3 ? => False #On ne rajoute pas d'élément dans la liste L car il reste un élément à tester dans la liste 2

                  1 == 4 ? => False #Il ne reste plus d'élément à tester dans la liste 2, je rajoute donc le 1 à la liste L, l=[1]. On passe à l'élément suivant dans la liste 1

                  2 == 3 ? => False, L = [1]

                  2 == 4 ? = False, L=[1,2]

                  3==3 ? True, break

                  4 == 4 ? True, break

                  #Tous les éléments dans la liste 1 sont testés. On renvoie L.

                  Donc au final L est censé valoir quoi ? L = [1, 2] ? Il faut renvoyer la liste de tous les éléments qui sont dans la première liste et pas dans la seconde ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 janvier 2020 à 0:28:30

                    Ok mais plus généralement, il s'agit de déterminer les éléments de la 1re liste qui ne sont pas dans la 2de ? En admettant que ce soit cela, et si tu ne veux pas utiliser l'opérateur in (et donc faire une double boucle comme tu as fait plus haut), tu peux écrire :

                    def differences(L, M):
                        D = []
                        for x in L:
                            for y in M:
                                if x == y:
                                    break
                            if x != y:
                                D.append(x)
                        return D
                    
                    D = differences([1, 2, 3, 4], [3, 4])
                    print(D)

                    [en réalité, ce serait un cas d'utilisation de l'instruction for/else, très rare d'utilisation et que tu peux ignorer pour ton problème].

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 janvier 2020 à 10:21:41

                      PascalOrtiz a écrit:

                      [en réalité, ce serait un cas d'utilisation de l'instruction for/else, très rare d'utilisation et que tu peux ignorer pour ton problème].

                      Utiliser la clause else des boucles n'est pas rare du tout ! On la retrouve dans de très nombreux cas d'usage !

                      def compare(a, b):
                          if a == b:
                              return 0
                          elif a < b:
                              return -1
                          return 1
                      
                      def difference(ls1, ls2):
                          ls = []
                          for a in ls1:
                              for b in ls2:
                                  if compare(a, b):
                                      break
                              else:
                                  ls.append(a)
                          return ls



                      • Partager sur Facebook
                      • Partager sur Twitter

                      Différences entre deux listes

                      × 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