web-dev-qa-db-fra.com

Liste compréhension avec déclaration if

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

>>> 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ù le ^ a été placé. Quel est le problème avec cette fonction de lamba?

87
OrangeTux

Vous avez mal compris votre commande. Le if devrait être placé après le for (à moins que ce ne soit dans un if-else opérateur ternaire)

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

Cela fonctionnerait cependant:

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

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 équivalents imbriqués spécifiés, la déclaration ci-dessus se traduisant essentiellement par:

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

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

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

mais une liste de compréhension doit commencer par au moins n boucle externe.

36
Martijn Pieters

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

Il suffit de changer l'ordre:

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

liste formule de compréhension:

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

ainsi vous pouvez le faire comme ceci:

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

Seulement à des fins de démonstration: [y si y n'est pas dans b sinon Faux pour y dans a]

5
Vishvajit Pathak