2014-05-02 66 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 ]