Lista de comprensión con declaración if

106

Quiero comparar 2 iterables e imprimir los elementos que aparecen en ambos 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])
                              ^

Pero me da un error de sintaxis no válido donde ^se ha colocado. ¿Qué tiene de malo esta función lamba?

OrangeTux
fuente
5
todas las respuestas a continuación son correctas, pero b = ('q')tampoco crean una tupla. Las tuplas con un elemento necesitan un elemento explícito ,, es decirb = ('q',)
dmg
Me he cambiado tuplesa iterables.
OrangeTux

Respuestas:

187

Te equivocaste en el pedido. El ifdebería haber después de la for(a menos que sea en un if-elseoperador ternario)

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

Sin embargo, esto funcionaría:

[y if y not in b else other_value for y in a]
Volatilidad
fuente
Gracias. Vi esta publicación stackoverflow.com/questions/4406389/… sobre una declaración if else en una función lambda. Y pensé que usar solo la instrucción if (sin el else) funcionaría en el mismo orden.
OrangeTux
39

Pones el ifal final:

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

Las listas por comprensión se escriben en el mismo orden que sus contrapartes anidadas de especificación completa, esencialmente la declaración anterior se traduce en:

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

Su versión intentó hacer esto en su lugar:

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

pero la comprensión de una lista debe comenzar con al menos un bucle externo.

Martijn Pieters
fuente
Has sido de mucha ayuda. Gracias.
Tolgahan ÜZÜN
7

lista de fórmula de comprensión:

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

así puedes hacerlo así:

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

Solo para fines de demostración: [y si y no en b, de lo contrario, es falso para y en a]

Vishvajit Pathak
fuente
2
No se puede poner una elsecomprensión en una lista, al menos no donde se pone una. No confunda una comprensión de lista (filtrado) con una expresión condicional (que debe tener un valor, por lo que la expresión else es obligatoria).
Martijn Pieters
De acuerdo. elseutilizarse en la comprensión de listas, como se muestra en el código.
Vishvajit Pathak
2
Esa es una expresión condicional . Se puede utilizar en cualquier lugar donde sea aplicable una expresión válida. No tiene comprensiones específicas para enumerar.
Martijn Pieters
5

Esta no es una función lambda. Es una lista de comprensión.

Simplemente cambie el orden:

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

Investigué y probé las sugerencias mencionadas anteriormente de comprensión de listas para mi situación, como se describe a continuación, sin embargo, no funcionó. ¿Qué estoy haciendo mal aquí?

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)

No está filtrando las palabras.

Deepak Dhiman
fuente
1
Lo que debe hacer es hacer una pregunta. No publique una respuesta.
Whirl Mind
En realidad, me está diciendo que publique una pregunta después de 1 día de descanso de los últimos 2 días para mí. Básicamente, no puedo publicar preguntas debido a mi pregunta anterior, que no estaba según el estándar de stackoverflow. Perdón por las molestias.
Deepak Dhiman