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?


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]

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.


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]


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]

-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.