Python列表理解
问题描述:
我试图写一个简要清单理解语句来创建一个CDF: 例如:
print f([0.2, 0.3,0.1,0.4])
[0.2,0.5,0.6,1.0]
标准程序看起来像这样(我想写一个列表理解È函数f()):
def f(probabilities) :
sum = 0
returnList = []
for count in probabilities:
sum +=count
returnList = returnList + [sum]
return returnList
编辑:我发现了一个函数numpy.cumsum()。我会检查它是否使用列表解析。
答
该操作非常常见,以至于许多语言(主要是功能语言,但不仅仅是)为其提供抽象,通常名称为scanl
(它就像具有中间结果的reduce
)。让我们把它ireduce
(“迭代减少”):
def ireduce(f, state, it):
for x in it:
state = f(state, x)
yield state
现在使用它:
import operator
def f(probabilities):
return ireduce(operator.add, 0, probabilities)
print(list(f([0.2, 0.3,0.1,0.4])))
# [0.2, 0.5, 0.6, 1.0]
答
[sum(probabilities[:i+1]) for i in range(len(probabilities))]
但是不要这样做,因为它是O(n^2)。 Python列表解析不是为此设计的。使用您已经编写的程序代码。
答
这不是真的很漂亮,而且它不使用列表理解,但你可以用降低做到这一点()函数,其中累计值是保持当前的总和,结果列表中的元组:
a = [0.2, 0.3, 0.1, 0.4]
reduce((lambda result, val: (result[0] + val, result[1] + [result[0] + val])), a, (0, []))[1]
Python的缺乏多行拉姆达的支持使这种丑陋。使用单独的功能会更好:
a = [0.2, 0.3, 0.1, 0.4]
def accumulate(result, val):
return (result[0] + val, result[1] + [result[0] + val])
reduce(accumulate, a, (0, []))[1]
问题是什么? – Elalfer 2011-01-25 20:54:08
@Elalfer - 这听起来像他想写一个行为与他的f()函数相同的列表理解。 – 2011-01-25 20:56:10
这是正确的。我的不好,我应该更加明确。 – GeneralBecos 2011-01-25 21:16:52