2016-11-08 58 views
0

我正在检查用python编写的代码,但我对以下行感到困惑。Python 2.7减少lambda语句转换为列表理解

return (reduce(lambda x, y: x + y[0],myList, 0)/len(Actions),) 

此代码将x和y作为输入和x和y的第一个元素。之后,我认为它将myList减少为x + y [0]的值。我如何使用列表理解而不是使用lambda来实现这一点。

+1

你阅读的文档是什么[减少](https://docs.python.org/3/library/functools.html#functools.reduce)呢? – idjaw

+0

'reduce'使用你的'lambda'并在'myList'中的所有元素上重复它 - 每次它将两个元素减少为一个元素。 – furas

+0

是的,我已经解释了减少了什么。我需要的是将其转换为列表理解。我来自java背景,所以我不熟悉这个术语。 – Prethia

回答

3

对应井列表理解的部分是它的第二个参数y还原的功能是什么:

tmp = [ y[0] for y in myList ] 

还原功能,然后一个元素结合这个名单在同一时间的“蓄电池” x

x = 0 # The third argument to reduce 
tmp = [ y[0] for y in myList ] 
for y in tmp: 
    x += y 

或者更简单地说

x = 0 
for y in myList: 
    x += y[0] 

或者,你可能已经认可现在

sum(y[0] for y in myList) 
+0

我了解你和furas编写的代码,但在理解myList中的0意味着什么时,仍然存在一些问题,0。那里还有一个/ lengthOfList。所以我的新列表应该由myList = sum(y [0] for myList)来定义,我的返回值应该是myList/len(Actions)。我对么? – Prethia

+0

没错。关于0,它只是第一次调用该函数时作为'x'参数传递的值。如果没有第三个参数,则首先在前两个列表项上调用该函数,然后在前一个结果和下一个连续调用的列表元素上调用该函数。换句话说,'reduce(f,lst)== reduce(f,lst [1:],lst [0])'。 (注意,这意味着没有第三个参数,列表不能为空;'reduce'在这种情况下会引发'TypeError')。 – chepner

+0

看来我对你的评论有一个错误。由于在行尾有一个[],我应该返回[myList/lenActions(),[])。我接受你的答案 – Prethia