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?


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]

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.


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]


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]

-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.