2016-08-18 83 views
0

在Haskell,我可以做如何在列表理解中定义一个变量?

Prelude> [(y*3, y+4) | x<-[0..5], let y=x^2] 
[(0,4),(3,5),(12,8),(27,13),(48,20),(75,29)] 

什么是Python中的等价物,但不重复功率运行,因为我需要在

>>> [((x**2)*3, (x**2)+4) for x in range(5)] 
[(0, 4), (3, 5), (12, 8), (27, 13), (48, 20)] 

我当然可以效仿的Haskell代码以拉姆达,但那并不觉得Pythonic ...

>>> [(lambda y: (y*3, y+4))(x**2) for x in range(5)] 
+0

简而言之:用嵌套的发生器。 '(a * 3,a + 4)for a(x ** 2 for x in range(5)]' – TigerhawkT3

回答

1

你不能在理解指定变量,但你可以使用嵌套发电机表达,做什么,我想你想(没有lambda函数)。

[(y*3, y+4) for y in (x**2 for x in range(5))] 
1

你不能那样做。赋值总是Python中的一个语句;列表推导只能包含表达式。

+0

真的吗?我可以用lambda达到目标,所以我并不真的买它可以只能用表达式来完成......只是......没有比lambda更习惯的解决方案吗? – leftaroundabout

1

如何:

>>> [(x*3, x + 4) for x in map(lambda y: y**2, range(5))] 
[(0, 4), (3, 5), (12, 8), (27, 13), (48, 20)]