Compréhension de la liste avec instruction if

106

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

OrangeTux
la source
5
toutes les réponses ci-dessous sont correctes, mais b = ('q')ne crée pas non plus de tuple. Les tuples avec un élément ont besoin d'un explicite ,, c'est-à-direb = ('q',)
dmg
Je me suis changé tuplesen iterables.
OrangeTux

Réponses:

187

Vous avez mal reçu la commande. Le ifdevrait être après le for(sauf s'il s'agit d'un if-elseopé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]
Volatilité
la source
Merci. J'ai vu ce post stackoverflow.com/questions/4406389/… à propos d'une instruction if else dans une fonction lambda. Et je pensais qu'utiliser uniquement l'instruction if (sans le else) fonctionnerait dans le même ordre.
OrangeTux
39

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 entièrement spécifiés, essentiellement l'instruction ci-dessus se traduit par:

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

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

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

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

Martijn Pieters
la source
Vous avez été très utile. Je vous remercie.
Tolgahan ÜZÜN
7

formule de compréhension de liste:

[<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]

Uniquement à des fins de démonstration: [y if y not in b else False for y in a]

Vishvajit Pathak
la source
2
Vous ne pouvez pas mettre un elsedans une liste de compréhension, pas là où vous en mettez un au moins. Ne confondez pas une compréhension de liste (filtrage) avec une expression conditionnelle (qui doit avoir une valeur, rendant l'expression else obligatoire).
Martijn Pieters
Se mettre d'accord. elseêtre utilisé dans la compréhension de la liste comme indiqué dans le code.
Vishvajit Pathak
2
C'est une expression conditionnelle . Il peut être utilisé partout où une expression valide est applicable. Il n'a pas de spécificité de lister les compréhensions.
Martijn Pieters
5

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

Changez simplement l'ordre:

[ y for y in a if y not in b]
eumiro
la source
-2

J'ai recherché et essayé les suggestions ci-dessus de compréhension de liste pour ma situation comme décrit ci-dessous, mais cela n'a pas fonctionné. Qu'est-ce que je fais de mal ici?

sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']]

stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from']

x=[a for a in sent_splt if a not in stop_set]
print(x)

Ce n'est pas filtrer les mots.

Deepak Dhiman
la source
1
Ce que vous devez faire, c'est poser une question. Ne postez pas de réponse.
Whirl Mind le
En fait, il est dit de poster une question après 1 jour de pause des 2 derniers jours pour moi. Fondamentalement, je ne suis pas autorisé à publier une question à cause de ma question précédente qui n'était pas conforme à la norme stackoverflow. Désolé pour l'incohérence.
Deepak Dhiman le