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