itertools accumulate 构建递归列表
itertools accumulate to build a recursive list
我想以这种方式从种子构建列表:
seed, seed*weight - seed*weight**2
,依此类推,前一个数字是下一个的种子。
所以 .5
的 seed
和 3
的 weight
我们会得到
.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)
我想以这种方式从种子构建列表:
seed, seed*weight - seed*weight**2
,依此类推,前一个数字是下一个的种子。
所以 .5
的 seed
和 3
的 weight
我们会得到
.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)