itertools accumulate 构建递归列表

itertools accumulate to build a recursive list

我想以这种方式从种子构建列表: seed, seed*weight - seed*weight**2,依此类推,前一个数字是下一个的种子。

所以 .5seed3weight 我们会得到

.5, -4, 24.0 等等

这是我认为可行的方法:

from itertools import accumulate, repeat 

relationship = lambda seed, weight: seed*weight - seed*weight**2
seed = .5 
weight = 3
inputs = list(repeat(seed,10))
first = [x for x in accumulate(inputs, relationship)]

问题是输入列表创建了一个 .5 列表,而不是用我想要的数字向前填充列表吗?

您的 accumulate 调用根本没有使用您声明的 weight 变量。相反,它使用 inputs 中的第一个值作为第一个 seed(这是预期的),并将所有其他值作为权重(不是预期的)。

您可以使用不同的 inputs 列表:

inputs = [seed] + [weight]*10
results = list(accumulate(inputs, relationships))

但我不确定 accumulate 是否真的是解决此问题的最佳方法。我认为用另一种方式解决问题会更自然,例如使用无限生成器函数:

def gen(seed, weight):
    while True:
        seed = seed * weight - seed * weight**2
        yield seed

由于该级数是一个简单的几何级数(每一步乘以 weight - weight**2),您还可以编写一个函数来计算一个封闭式方程中的每个值:

def calc(seed, weight, n):
    factor = weight - weight**2
    return seed * factor**(n+1)