2013-03-18 6 views
57

Ich möchte 2 iterables vergleichen und die Elemente, die in beiden iterables erscheinen.List Verständnis mit If-Anweisung

>>> 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 in dem die ^ platziert wurde. Was ist falsch an dieser Lamba-Funktion?

+5

alle unten Antworten sind richtig, aber auch 'b = ('q')' ist ein Tupel nicht erstellen. Tupel mit einem Element brauchen ein explizites ',', das heißt 'b = (' q ',) ' – dmg

+0

Ich habe' Tupel' in 'Iterables' geändert. – OrangeTux

Antwort

105

Sie haben die Bestellung falsch. Die if sollte nach dem for sein (es sei denn, es in einem if-else ternäre Operator ist)

[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] 
+0

Danke. Ich habe diesen Beitrag http://stackoverflow.com/questions/4406389/if-else-in-a-list-comprehension über eine if else-Anweisung in einer Lambda-Funktion gesehen. Und ich dachte, dass nur die if-Anweisung (ohne die else) in der gleichen Reihenfolge funktionieren würde. – OrangeTux

4

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

Nur die Reihenfolge ändern:

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

Natürlich. Blöd. – OrangeTux

28

Sie setzen die if am Ende:

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

Liste Comprehensions sind in der gleichen Reihenfolge wie ihre verschachtelten Voll angegebenen Kollegen geschrieben, im wesentlichen die oben Aussage übersetzt in:

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

Ihre Version stattdessen zu tun versucht, dies:

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

aber eine Liste Verständnis Muss mit mindestens einem äußeren Schleife starten.

+0

Sie waren sehr hilfreich. Vielen Dank. –

3

Liste Verständnis Formel:

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

so können Sie tun Sie es so:

[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]

+0

Sie können ein "else" nicht in ein Listenverständnis einfügen, nicht dort, wo Sie mindestens eins setzen. Verwechseln Sie nicht ein Listenverständnis (Filterung) mit einem bedingten Ausdruck (der einen Wert haben muss, der den else-Ausdruck zwingend macht). –

+0

Zustimmen. 'else' wird jedoch im Listenverständnis verwendet, wie im Code gezeigt. –

+0

Das ist ein * bedingter Ausdruck *. Es kann überall dort verwendet werden, wo ein gültiger Ausdruck anwendbar ist. Es ist nicht spezifisch, Auffassungen zu listen. –

Verwandte Themen