Compreensão da lista com a declaração if

106

Quero comparar 2 iteráveis ​​e imprimir os itens que aparecem em ambos os iteráveis.

>>> 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])
                              ^

Mas isso me dá um erro de sintaxe inválida onde o ^foi colocado. O que há de errado com essa função lamba?

OrangeTux
fonte
5
todas as respostas abaixo estão certas, mas também b = ('q')não criam uma tupla. Tuplas com um elemento precisam de um explícito ,, ou sejab = ('q',)
dmg
Eu mudei tuplespara iterables.
OrangeTux

Respostas:

187

Você entendeu o pedido errado. O ifdeve ser após o for(a menos que seja em um if-elseoperador ternário)

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

No entanto, isso funcionaria:

[y if y not in b else other_value for y in a]
Volatilidade
fonte
Obrigado. Eu vi este post stackoverflow.com/questions/4406389/… sobre uma instrução if else em uma função lambda. E eu pensei que usar apenas a instrução if (sem o else) funcionaria na mesma ordem.
OrangeTux
39

Você coloca o ifno final:

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

As compreensões de lista são escritas na mesma ordem que suas contrapartes totalmente especificadas aninhadas, essencialmente a declaração acima se traduz em:

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

Em vez disso, sua versão tentou fazer isso:

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

mas uma compreensão de lista deve começar com pelo menos um loop externo.

Martijn Pieters
fonte
Você foi muito útil. Obrigado.
Tolgahan ÜZÜN
7

fórmula de compreensão de lista:

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

portanto, você pode fazer assim:

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

Apenas para fins de demonstração: [y if y not in b else False for y in a]

Vishvajit Pathak
fonte
2
Você não pode colocar um elseem uma compreensão de lista, não onde você coloca, pelo menos. Não confunda a compreensão de uma lista (filtragem) com uma expressão condicional (que deve ter um valor, tornando a expressão else obrigatória).
Martijn Pieters
Aceita. elseser usado na compreensão da lista, embora conforme mostrado no código.
Vishvajit Pathak
2
Essa é uma expressão condicional . Ele pode ser usado em qualquer lugar em que uma expressão válida seja aplicável. Não é específico para listar compreensões.
Martijn Pieters
5

Esta não é uma função lambda. É uma compreensão de lista.

Basta alterar a ordem:

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

Eu pesquisei e tentei as sugestões acima mencionadas de compreensão de lista para a minha situação, conforme descrito abaixo, mas não funcionou. O que eu estou fazendo errado aqui?

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)

Não está filtrando as palavras.

Deepak Dhiman
fonte
1
O que você precisa fazer é fazer uma pergunta. Não poste uma resposta.
Whirl Mind
Na verdade, ele está dizendo para postar uma pergunta após um intervalo de 1 dia dos últimos 2 dias para mim. Basicamente, não tenho permissão para postar perguntas por causa da minha pergunta anterior, que não estava de acordo com o padrão stackoverflow. Desculpe pelo inconveniente.
Deepak Dhiman