Понимание списка с помощью оператора if

106

Я хочу сравнить 2 итерации и распечатать элементы, которые появляются в обеих итерациях.

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

Но это дает мне неверную синтаксическую ошибку там, где ^был помещен. Что не так в этой ламба-функции?

OrangeTux
источник
5
все ответы ниже верны, но также b = ('q')не создают кортеж. Кортежи с одним элементом нуждаются в явном указании ,, то естьb = ('q',)
dmg
Я превратился tuplesв iterables.
OrangeTux

Ответы:

187

Вы ошиблись в заказе. ifДолжно быть после того , как for(если это не находится в if-elseтройном оператора)

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

Однако это сработает:

[y if y not in b else other_value for y in a]
Волатильность
источник
Спасибо. Я видел это сообщение stackoverflow.com/questions/4406389/… об операторе if else в лямбда-функции. И я подумал, что использование только оператора if (без else) будет работать в том же порядке.
OrangeTux
39

Ставите ifв конце:

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

Компоненты списков записываются в том же порядке, что и их вложенные полностью определенные аналоги, по сути, приведенный выше оператор переводится как:

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

Ваша версия пыталась сделать это вместо этого:

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

но понимание списка должно начинаться по крайней мере с одного внешнего цикла.

Мартейн Питерс
источник
Вы мне очень помогли. Спасибо.
Tolgahan ÜZÜN
7

формула понимания списка:

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

таким образом, вы можете сделать это так:

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

Только для демонстрации: [y if y not in b else False for y in a]

Вишваджит Патхак
источник
2
Вы не можете поместить elseпонимание в список, по крайней мере, там, где вы его поместите. Не путайте понимание списка (фильтрацию) с условным выражением (которое должно иметь значение, что делает выражение else обязательным).
Мартин Питерс
Согласен. elseиспользоваться в понимании списка, как показано в коде.
Вишваджит Патхак
2
Это условное выражение . Его можно использовать везде, где применимо допустимое выражение. Он не имеет конкретных значений для перечисления.
Martijn Pieters
5

Это не лямбда-функция. Это понимание списка.

Просто измените порядок:

[ y for y in a if y not in b]
Eumiro
источник
-2

Я исследовал и попробовал вышеупомянутые предложения по пониманию списка для моей ситуации, как описано ниже, но это не сработало. Что я здесь делаю не так?

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)

Это не фильтрация слов.

Дипак Диман
источник
1
Что вам нужно сделать, это задать вопрос. Не публиковать ответ.
Whirl Mind,
На самом деле, это говорит о том, что я должен задать вопрос после 1-дневного перерыва из последних 2-х дней. В принципе, мне не разрешено публиковать вопрос из-за моего предыдущего вопроса, который не соответствовал стандарту stackoverflow. Приносим извинения за неудобства.
Дипак Дхиман