Rozumienie listy z instrukcją if

106

Chcę porównać 2 iterowalne i wydrukować elementy, które pojawiają się w obu iterowalnych.

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

Ale daje mi nieprawidłowy błąd składni, w którym ^został umieszczony. Co jest nie tak z tą funkcją Lamba?

OrangeTux
źródło
5
wszystkie poniższe odpowiedzi są poprawne, ale b = ('q')nie tworzą też krotki. Krotki z jednym elementem wymagają jawnego ,, czylib = ('q',)
dmg
Zmieniłem się tuplesw iterables.
OrangeTux

Odpowiedzi:

187

Złe zamówienie. ifPowinny być po for(chyba, że jest w if-elseoperator potrójnego)

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

To jednak zadziała:

[y if y not in b else other_value for y in a]
Zmienność
źródło
Dzięki. Widziałem ten post stackoverflow.com/questions/4406389/ ... o instrukcji if else w funkcji lambda. Pomyślałem, że użycie tylko instrukcji if (bez else) zadziała w tej samej kolejności.
OrangeTux,
39

Umieszczasz ifna końcu:

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

Listy składane są zapisywane w tej samej kolejności, co ich zagnieżdżone, w pełni określone odpowiedniki, zasadniczo powyższe stwierdzenie przekłada się na:

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

Twoja wersja próbowała to zrobić zamiast tego:

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

ale rozumienie listy musi zaczynać się przynajmniej jedną zewnętrzną pętlą.

Martijn Pieters
źródło
Byłeś bardzo pomocny. Dziękuję Ci.
Tolgahan ÜZÜN
7

Formuła rozumienia listy:

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

więc możesz to zrobić w ten sposób:

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

Tylko do celów demonstracyjnych: [y jeśli y nie w b else Fałsz dla y in a]

Vishvajit Pathak
źródło
2
Nie możesz umieścić wyrażenia elsena liście, a nie tam, gdzie umieścisz przynajmniej jedno. Nie należy mylić rozumienia listy (filtrowania) z wyrażeniem warunkowym (które musi mieć wartość, co oznacza, że ​​wyrażenie else jest obowiązkowe).
Martijn Pieters
Zgodzić się. elsebyć używane w zrozumieniu list, jak pokazano w kodzie.
Vishvajit Pathak
2
To wyrażenie warunkowe . Można go używać wszędzie tam, gdzie ma zastosowanie prawidłowe wyrażenie. Nie ma specyficznego spisania zdań.
Martijn Pieters
5

To nie jest funkcja lambda. To jest zrozumienie listy.

Po prostu zmień kolejność:

[ y for y in a if y not in b]
eumiro
źródło
-2

Zbadałem i wypróbowałem wyżej wymienione sugestie dotyczące zrozumienia listy dla mojej sytuacji, jak opisano poniżej, ale nie zadziałało. Co ja tu robię źle?

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)

To nie jest filtrowanie słów.

Deepak Dhiman
źródło
1
Musisz zadać pytanie. Nie publikuj odpowiedzi.
Whirl Mind
Właściwie to znaczy, żebym zadał pytanie po 1 dniu przerwy od ostatnich 2 dni. Zasadniczo nie mogę publikować pytań z powodu mojego poprzedniego pytania, które nie było zgodne ze standardem stackoverflow. Przepraszamy za niedogodności.
Deepak Dhiman