136 votes

Compréhension de la liste avec l'instruction if

Je veux comparer 2 itérables et imprimer les éléments qui apparaissent dans les deux itérables.

>>> a = ('q', 'r')
>>> b = ('q')

# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

Mais cela me donne une erreur de syntaxe invalide où l'élément ^ a été placé. Qu'est-ce qui ne va pas dans cette fonction lamba ?

244voto

Volatility Points 12668

Tu t'es trompé dans l'ordre. Le site if doit se trouver après le for (sauf si elle se trouve dans un if-else opérateur ternaire)

[y for y in a if y not in b]

Cela pourrait toutefois fonctionner :

[y if y not in b else other_value for y in a]

48voto

Martijn Pieters Points 271458

Vous mettez le if à la fin :

[y for y in a if y not in b]

Les compréhensions de liste sont écrites dans le même ordre que leurs homologues imbriqués et entièrement spécifiés, essentiellement la déclaration ci-dessus se traduit par :

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

Votre version a essayé de faire ça à la place :

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

mais une compréhension de la liste debe commencer avec au moins un boucle extérieure.

9voto

Vishvajit Pathak Points 948

Formule de compréhension de la liste :

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

vous pouvez donc le faire comme ceci :

[y for y in a if y not in b]

Uniquement à des fins de démonstration : [y si y n'est pas dans b else False pour y dans a ]

5voto

eumiro Points 56644

Ce n'est pas une fonction lambda. C'est une fonction de compréhension de liste.

Il suffit de changer l'ordre :

[ y for y in a if y not in b]

1voto

artdanil Points 1589

Si vous utilisez une liste suffisamment grande not in b effectuera une recherche linéaire pour chacun des éléments de la clause a . Pourquoi ne pas utiliser set ? Set prend l'itérable comme paramètre pour créer un nouvel objet set.

>>> a = ["a", "b", "c", "d", "e"]
>>> b = ["c", "d", "f", "g"]
>>> set(a).intersection(set(b))
{'c', 'd'}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X