Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un test d'une valeur dans une liste.

    1 mars 2013 à 21:17:57

    Bonjour,

    Je suis débutant sur python et j'ai un problème sur une condition pour tester si une valeur est dans une liste :

    	a = ['Etre','Avoir','Chanter','Vouloir','Choisir','Faire','Aimer','Manger','Placer','Croire','Vivre','Ecrire']
    	b = ['Choisir','Avoir','Payer','Croire']
    	c = []
    	for d in range(len(b)):
    		if b[d] in a == True:
    			c.append(a.index(b[d]))
    		else:
    			c.append(-1)
    		print(b[d] in a)
    	print(c)

    quand je test ce code il me retourne ceci :

    True
    True
    False
    True
    [-1, -1, -1, -1]

    Je veut simplement mettre dans la liste 'c' l'index de la liste 'a' des valeurs de la liste 'b' si cette dernière existe et dans le cas contraire mettre '-1' dans la liste 'c' . Pourquoi cette ligne pose problème :

    if b[d] in a == True:

    alors que cette ligne fonctionne bien :

    print(b[d] in a)

     Merci.

    -
    Edité par MiloMilestone 1 mars 2013 à 21:18:20

    • Partager sur Facebook
    • Partager sur Twitter
      1 mars 2013 à 21:48:41

      Je viens de comprendre mon erreur, '==True' est en trop.
      • Partager sur Facebook
      • Partager sur Twitter
        2 mars 2013 à 0:04:40

        Alors là, je crois que tu viens de découvrir un bug de Python !

        >>> 1 in [1, 2, 3] == True
        False
        

        Ce résultat n'est absolument pas normal. Cette expression devrait soit retourner True, soit déclencher une erreur :

        >>> (1 in [1, 2, 3]) == True
        True
        >>> 1 in ([1, 2, 3] == True)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: argument of type 'bool' is not iterable
        >>> True == True
        True
        

        Quoi qu'il en soit, ton "== True" est effectivement inutile.

        -
        Edité par nohar 2 mars 2013 à 0:07:47

        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          2 mars 2013 à 0:27:27

          Ah mais non, je viens de comprendre ce comportement !

          Si on affiche l'arbre syntaxique que Python crée pour cette expression, on obtient ceci :

          >>> import ast
          >>> ast.dump(ast.parse('1 in [1, 2, 3] == True'), annotate_fields=False)
          "Module([Expr(Compare(Num(1), [In(), Eq()], [List([Num(1), Num(2), Num(3)], Load()), Name('True', Load())]))])"
          

          Curieusement, contrairement à ce à quoi on pourrait s'attendre, on n'obtient pas deux noeuds de comparaison imbriqués comme ceci :

          Compare(
              'eq', 
              Compare(
                  'in', 
                  1, 
                  list(1, 2, 3)), 
              True)
          

          Mais un seul noeud qui comprend deux opérateurs :

          Compare(
              ['in', 'eq'],
              1,
              list(1, 2, 3),
              True)
          

          En se demandant pourquoi un tel noeud est créé (et à quoi ça sert), on se rappelle que Python est capable d'évaluer des expressions de ce genre :

          >>> a = 4
          >>> 2 < a < 5
          True
          >>> 5 < a < 7
          False
          

          Et justement :

          >>> ast.dump(ast.parse('1 < 3 < 5'), annotate_fields=False)
          'Module([Expr(Compare(Num(1), [Lt(), Lt()], [Num(3), Num(5)]))])'
          

          Soit en gros :

          Compare(
              ['<', '<'],
              1,
              3, 
              5)
          

          Tout ça pour dire que 1 in [1, 2, 3] == True est en fait équivalent à 1 in [1, 2, 3] and [1, 2, 3] == True, ce qui vaut évidemment False puisque [1, 2, 3] != True.

          Ce n'est donc pas un bug. C'est simplement que la syntaxe que tu as utilisée ne correspondait pas à ce que tu voulais faire. :)

          EDIT : Cela dit, c'est un peu déconcertant que l'opérateur in ait la même précédence que les autres opérateurs de comparaison. Sémantiquement, ce n'en est pas vraiment un.

          -
          Edité par nohar 2 mars 2013 à 11:03:13

          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !

          Un test d'une valeur dans une liste.

          × 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