我有这段代码:
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
答案 0 :(得分: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..in
和if
语句之后才能出现表达式。
在您的情况下,expression
满足x ** y
,然后list_for
满足for x in [10, 20, 30]
,list_for
满足另一个for x in [10, 20, 30]
最后list_if
满足if 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]
答案 1 :(得分:6)
print [ x ** y for x in [10, 20, 30] for y in [2, 3, 4] if y > 0]
答案 2 :(得分:1)
记住这个理解语法。 dict comprehension的“{}”
[ expression for target1 in iterable1 if condition1
for target2 in iterable2 if condition2 ...
for targetN in iterableN if conditionN ]