преобразование в понимание списка

У меня есть этот код:

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 

Условие фильтрации должно быть в конце, как это

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

потому что грамматика для понимания списка определяется следующим образом:

 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] 

Вам нужно выражение if в конце понимания списка

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

Помните этот синтаксис для понимания. '{}' для понимания dict

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