Listenverständnis mit if-Anweisung

106

Ich möchte 2 Iterables vergleichen und die Elemente drucken, die in beiden Iterables erscheinen.

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

Aber es gibt mir einen ungültigen Syntaxfehler, wo der ^platziert wurde. Was ist falsch an dieser Lamba-Funktion?

OrangeTux
quelle
5
Alle Antworten unten sind richtig, b = ('q')erzeugen aber auch kein Tupel. Tupel mit einem Element benötigen eine explizite ,, das heißtb = ('q',)
dmg
Ich habe mich verändert tuplesin iterables.
OrangeTux

Antworten:

187

Du hast die Bestellung falsch verstanden. Das ifsollte nach dem sein for(es sei denn, es ist in einem if-elseternären Operator)

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

Dies würde jedoch funktionieren:

[y if y not in b else other_value for y in a]
Volatilität
quelle
Vielen Dank. Ich habe diesen Beitrag stackoverflow.com/questions/4406389/… über eine if else-Anweisung in einer Lambda-Funktion gesehen. Und ich dachte, dass die Verwendung nur der if-Anweisung (ohne das else) in derselben Reihenfolge funktionieren würde.
OrangeTux
39

Sie setzen das ifam Ende:

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

Listenverständnisse werden in derselben Reihenfolge geschrieben wie ihre verschachtelten, vollständig spezifizierten Gegenstücke. Die obige Aussage bedeutet im Wesentlichen:

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

Ihre Version hat stattdessen versucht, dies zu tun:

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

Ein Listenverständnis muss jedoch mit mindestens einer äußeren Schleife beginnen.

Martijn Pieters
quelle
Du warst sehr hilfreich. Danke dir.
Tolgahan ÜZÜN
7

Listenverständnisformel:

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

So können Sie es machen:

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

Nur zu Demonstrationszwecken: [y wenn y nicht in b sonst Falsch für y in a]

Vishvajit Pathak
quelle
2
Sie können elseein Listenverständnis nicht einfügen, nicht mindestens dort, wo Sie es eingefügt haben. Verwechseln Sie ein Listenverständnis (Filtern) nicht mit einem bedingten Ausdruck (der einen Wert haben muss, sodass der else-Ausdruck obligatorisch ist).
Martijn Pieters
Zustimmen. elsefür das Listenverständnis verwendet werden, wie im Code gezeigt.
Vishvajit Pathak
2
Das ist ein bedingter Ausdruck . Es kann überall dort verwendet werden, wo ein gültiger Ausdruck anwendbar ist. Es ist nicht spezifisch, das Verständnis aufzulisten.
Martijn Pieters
5

Dies ist keine Lambda-Funktion. Es ist ein Listenverständnis.

Ändern Sie einfach die Reihenfolge:

[ y for y in a if y not in b]
Eumiro
quelle
-2

Ich habe die oben genannten Vorschläge zum Listenverständnis für meine Situation wie unten beschrieben recherchiert und ausprobiert, aber es hat nicht funktioniert. Was mache ich hier falsch?

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)

Es filtert nicht die Wörter.

Deepak Dhiman
quelle
1
Was Sie tun müssen, ist eine Frage zu stellen. Keine Antwort posten.
Whirl Mind
Eigentlich heißt es, nach 1 Tag Pause von den letzten 2 Tagen für mich eine Frage zu stellen. Grundsätzlich darf ich keine Frage stellen, da meine vorherige Frage nicht dem Stackoverflow-Standard entspricht. Entschuldigung für die Unannehmlichkeit.
Deepak Dhiman