Перелічіть розуміння з твердженням 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])
                              ^

Але це дає мені помилкову синтаксичну помилку, де ^вона була розміщена. Що не так у цій функції лямби?


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 if у функції лямбда. І я думав, що використання лише оператора if (без іншого) буде працювати в тому ж порядку.
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, якщо ні, не b, помилково для y в a]


2
Ви не можете помістити список elseу розуміння списку, не там, де ви його принаймні. Не плутайте розуміння списку (фільтрування) із умовним виразом (який повинен мати значення, що робить вираз else обов'язковим).
Martijn Pieters

Погодьтеся. elseвикористовувати в розумінні списку, хоча, як показано в коді.
Vishvajit Pathak

2
Це умовне вираження . Він може бути використаний у будь-якому місці. Він не специфічний для переліку розумінь.
Martijn Pieters

5

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

Просто змініть порядок:

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

-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
Що вам потрібно зробити - це задати питання. Не публікуйте відповіді.
Вир розуму

Насправді, це говорить про те, щоб поставити запитання після 1-денної перерви для останніх 2 днів для мене. В основному мені не дозволяють ставити запитання через попереднє запитання, яке не було відповідно до стандарту stackoverflow. Вибачте за незручність.
Діпак Дхіман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.