【问题标题】:itertools accumulate to build a recursive listitertools 累加构建递归列表
【发布时间】:2017-07-26 17:23:07
【问题描述】:

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

所以对于.5 中的seed3 中的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)]

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

【问题讨论】:

  • 所以...您每次只是将数字乘以 -6(或通常乘以重量 - 重量**2)?

标签: python python-3.x itertools accumulate


【解决方案1】:

您的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)

【讨论】:

  • 非常感谢,yield 是我试图弄清楚如何使用但无法实现这一目标的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2012-05-26
  • 1970-01-01
  • 2021-12-28
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多