2010-06-01 13 views
142

Hier ist der Code, den ich in eine Liste Verständnis zu machen versuchte:Ist es möglich, 'else' in einem Python-Listenverständnis zu verwenden?

table = '' 
for index in xrange(256): 
    if index in ords_to_keep: 
     table += chr(index) 
    else: 
     table += replace_with 

Gibt es eine Möglichkeit, die else-Anweisung zu diesem Verständnis hinzufügen?

table = ''.join(chr(index) for index in xrange(15) if index in ords_to_keep) 

Antwort

229

Die Syntax a if b else c ist ein ternärer Operator in Python, den a auswertet, wenn die Bedingung b wahr ist - andernfalls wird ausgewertet c . Es kann im Verständnis Anweisungen verwendet werden:

>>> [a if a else 2 for a in [0,1,0,3]] 
[2, 1, 2, 3] 

Also für Ihr Beispiel

table = ''.join(chr(index) if index in ords_to_keep else replace_with 
       for index in xrange(15)) 
+9

Beachten Sie, dass dies nur funktioniert in Python 2.5 und später zu vermeiden. –

+3

genial! So nützlich. – professorDante

+6

Beachten Sie auch, dass das 'else' notwendig ist und nicht weggelassen werden kann, da immer ein resultierender Wert benötigt wird. – sebix

14

Wenn Sie ein else wollen Sie wollen nicht auf die Liste Verständnis filtern, wollen Sie es jeden Wert iterieren. Sie können stattdessen als Anweisung true-value if cond else false-value, und entfernen Sie die Filter vom Ende:

table = ''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15)) 
1

Außerdem würde ich richtig sein in dem Schluss, dass eine Liste Verständnis der effizienteste Weg, dies zu tun ist?

Vielleicht. List Comprehensions sind nicht von Natur aus rechenintensiv. Es läuft immer noch in linearer Zeit.

Aus meiner persönlichen Erfahrung: Ich habe die Rechenzeit beim Umgang mit großen Datensätzen erheblich reduziert, indem ich List Comprehensions (speziell verschachtelte) durch for-loop/list-affing-Typ Strukturen ersetzt habe. In dieser Anwendung bezweifle ich, dass Sie einen Unterschied bemerken werden.

+1

wops, ich wollte über die Join-Methode vs + = auf einer Zeichenfolge fragen. – Josh

+0

Interessant. Dies (http://wiki.python.org/moin/PythonSpeed#Take Advantageofinterpreteroptimizations) sagt etwas anderes. – kennytm

+0

@Josh: In älteren Versionen von Python ist die Join() -Methode weit überlegen. Neuere Versionen des Interpreters versuchen, die + = -Methode zu optimieren, aber ich bin mir nicht sicher, wie gut das funktioniert. Ich benutze fast immer nur die Join() Methode. –

6

Um die else in Listen-Comprehensions in Python-Programmierung zu verwenden, können Sie das folgende Snippet ausprobieren. Dies würde Ihr Problem lösen, das Snippet wird auf Python 2.7 und Python 3.5 getestet.

obj = ["Even" if i%2==0 else "Odd" for i in range(10)] 
0

Große Antworten, aber wollten nur eine Gotcha erwähnen, dass „pass“ Schlüsselwort wird in dem if/else Teil der Liste Verständnisses nicht (wie in den oben genannten Beispielen geschrieben).

#works 
list1 = [10, 20, 30, 40, 50] 
newlist2 = [x if x > 30 else x**2 for x in list1 ] 
print(newlist2, type(newlist2)) 

#but this WONT work 
list1 = [10, 20, 30, 40, 50] 
newlist2 = [x if x > 30 else pass for x in list1 ] 
print(newlist2, type(newlist2)) 

Dies ist auf Python 3.4 getestet und getestet. Fehler ist wie folgt:

newlist2 = [x if x > 30 else pass for x in list1 ]          
SyntaxError: invalid syntax 

Also, versuchen Sie Pass-es in Listenkomprehensionen

+0

Das if/else-Konstrukt ist nur ein Ausdruck für das Listenverständnis. Wenn Sie Elemente verlassen wollen, müssen Sie Ihren Ausdruck anstelle von 'expr2' hier setzen' [expr1 für x in list1 wenn expr2] ' –

+0

Nun, das funktioniert in einem normalen if else Block, für mich bedeutet das, dass es würde überall sonst auch funktionieren. Aber nicht so in Listenergänzungen. – Plankton

+1

Aber das ist kein normaler if/else-Block. Es ist [ein Ausdruck] (https://docs.python.org/3/faq/programming.html#is-there-an-eqivalent-of-c-s-ternary-operator). Du kannst elif auch nicht dort benutzen. –

Verwandte Themen