转换为列表理解

时间:2014-05-02 12:35:22

标签: python list list-comprehension

我有这段代码:

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

3 个答案:

答案 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..inif语句之后才能出现表达式。

在您的情况下,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)

您需要list comprehension

末尾的if语句
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 ]