2010-06-01 10 views
142

Oto kod starałem się przekształcić w listowego:Czy można używać "else" w zrozumieniu listy pytonów?

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

Czy istnieje sposób, aby dodać oświadczenie innego do tego ze zrozumieniem?

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

Odpowiedz

229

Składnia a if b else c jest trójskładnikowych operatora w Pythonie, które ocenia się a jeśli warunek b jest prawdą - w przeciwnym razie, to ocenia się c . Może być stosowany w sprawozdaniu ze zrozumieniem:

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

Tak dla przykładu,

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

Zauważ, że to działa tylko w Pythonie 2.5 i nowszym. –

+3

niesamowite! Tak przydatne. – professorDante

+6

Należy również zauważyć, że 'else' jest niezbędny i nie można go pominąć, ponieważ wartość wynikowa jest zawsze wymagana. – sebix

14

Jeśli chcesz else nie chcesz, aby filtrować listę zrozumieniem, chcesz go iteracyjne nad każdą wartość. Można użyć true-value if cond else false-value jako oświadczenia zamiast, i wyjąć filtr od końca:

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

Również chciałbym mieć rację, stwierdzając, że lista rozumienie jest najbardziej skuteczny sposób to zrobić?

Może. Wykazy listowe nie są z natury wydajne obliczeniowo. Ciągle działa w czasie liniowym.

Z mojego osobistego doświadczenia: Znacznie zmniejszyłem czas obliczeń podczas pracy z dużymi zbiorami danych, zastępując listy ze zrozumieniem (w szczególności te zagnieżdżone) strukturami typu for-loop/list-added, które posiadasz powyżej. W tej aplikacji wątpię, że zauważysz różnicę.

+1

woops, chciałem zapytać o metodę łączenia vs. + = na łańcuchu. – Josh

+0

Interesujące. To (http://wiki.python.org/moin/PythonSpeed#Takeadvantageofinterpreteroptimizations) mówi inaczej. – kennytm

+0

@Josh: w starszej wersji Pythona metoda join() jest znacznie lepsza. Nowsze wersje interpretatora próbują zoptymalizować metodę + =, ale nie jestem pewien, jak to działa. Prawie zawsze używam tylko metody join(). –

6

Aby użyć else w zrozumieniu listy w programowaniu Pythona, można wypróbować poniższy fragment. To rozwiązałoby twój problem, fragment został przetestowany na python 2.7 i python 3.5.

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

Wielkie odpowiedzi, ale po prostu chciałem wspomnieć Gotcha że „pass” słowo kluczowe nie będzie działać w if/else część list-zrozumieniem (jak pisał w przykładach wymienionych powyżej).

#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)) 

To jest wypróbowane i przetestowane na pythonie 3.4. Błąd jest jak poniżej:

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

Tak, staramy się uniknąć przejścia-es w listowych

+0

Konstrukcja if/else jest po prostu wyrażeniem, jeśli chodzi o zrozumienie listy. Jeśli chcesz zostawić elementy na zewnątrz, musisz umieścić tutaj wyrażenie 'expr2'' '[wyrażenie1 dla x na liście1, jeśli wyrażenie2]' –

+0

Przejście odwiertu działa w normalnym bloku if else, co oznacza, że działa również wszędzie. Ale nie na liście. – Plankton

+1

Ale to nie jest zwykły blok/else. To [wyrażenie] (https://docs.python.org/3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator). Nie możesz też użyć elifa. –

Powiązane problemy