2014-05-02 118 views
3

我有這樣的代碼:轉換成列表解析

result = [] 
for x in [10, 20, 30]: 
    for y in [2, 3, 4]: 
     if y > 0: 
      result.append(x ** y) 

結果

[100, 1000, 10000, 400, 8000, 160000, 900, 27000, 810000] 

我試圖將其轉換爲列表,沒有運氣理解(在python新)

這是我的嘗試:

print [ x ** y if y > 0 for x in [10, 20, 30] for y in [2, 3, 4]] 

但是在聲明中存在一個問題,任何幫助都將被佔用。

錯誤:

File "<stdin>", line 1 
    print [ x ** y if y > 0 for x in [10, 20, 30] for y in [2, 3, 4]] 
          ^
SyntaxError: invalid syntax 

回答

7

過濾條件必須是在端部,這樣

print [x ** y for x in [10, 20, 30] for y in [2, 3, 4] if y > 0] 

因爲grammar for list comprehension是這樣

list_display  ::= "[" [expression_list | list_comprehension] "]" 
list_comprehension ::= expression list_for 
list_for   ::= "for" target_list "in" old_expression_list [list_iter] 
list_iter   ::= list_for | list_if 
list_if    ::= "if" old_expression [list_iter] 

所以僅表達式定義可以在for..inif之前聲明只能在此之後纔會出現。

在你的情況,expressionx ** y滿足,然後list_forfor x in [10, 20, 30]滿足,然後又list_forfor x in [10, 20, 30]滿意,最後list_ifif y > 0滿足。它的形式是

[ expression list_for list_for list_if ] 

順便說一句,你可以做同樣的itertools.product,這樣

from itertools import product 
print [num**power for num,power in product([10, 20, 30], [2, 3, 4]) if power > 0] 
+0

你可能會顯示如何將過濾器在'itertools'版本(可能使用'itertools.ifilter'上的第二個參數'product')。 – chepner

1

末記住這個理解語法。對於字典理解「{}」

[ expression for target1 in iterable1 if condition1 
for target2 in iterable2 if condition2 ... 
for targetN in iterableN if conditionN ]