python3函数式编程:将不同列表中的项累积为初始值

时间:2018-01-13 02:36:19

标签: python-3.x functional-programming itertools

我有一些代码执行以下操作,但我想知道是否有更有效和可理解的方法来执行此操作。我认为itertools中可能存在某些可能用于执行此类操作的内容。

所以我有一个整数列表,表示从一个时期到下一个时期的项目数量的变化。

x = [0, 1, 2, 1, 3, 1, 1]

然后我需要一个函数来创建第二个列表,该列表累积从一个周期到下一个周期的项目总数。这类似于accumulate函数,但是使用其他列表中的元素而不是来自同一列表。

所以我可以从初始值y = 3开始。

列表y = [3]中的第一个值。我会采取第二个 x中的元素并将其添加到列表中,这意味着3+1 = 4。请注意,我接受了第二个元素,因为我们已经知道y的第一个元素。因此,y的更新值为[3, 4]。然后下一次迭代是4+2 = 6。等等。

我看到的代码如下:

def func():
    x = [0, 1, 2, 1, 3, 1, 1]
    y = [3]

    for k,v in enumerate(x):
        y.append(y[i] + x[i])
    return y

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你 =IMPORTRANGE("mydocsheet.com/spreadsheet", "Sheet1![my_number]") instead of =IMPORTRANGE("mydocsheet.com/spreadsheet", "Sheet1!B2") 做什么,但你也要添加一个初始值。你可以通过几种方式轻松地做到这一点。

最简单的方法是简单地在itertools.accumulate调用周围编写一个列表推导,为每个输出项添加初始值:

accumulate

另一种选择是在y = [3 + val for val in itertools.accumulate(x)] 列表前加上初始值,然后在x将其包含为输出中的第一个值时跳过它:

accumulate

答案 1 :(得分:0)

我认为有两件事需要修复:

第一个for循环的条件。我不知道你从哪里获得k,v,也许你得到了一个使用zip的例子(允许你一次迭代2个列表),但无论如何,你想要遍历列表x和使用他们的索引,一种方法是:

for i in range(len(x)):

第二,使用第一个附加作为示例,因为您要将x的第二个元素(索引1)添加到y的第一个元素(索引0),所以您希望对索引使用交错方法。这也将导致修改上面的for循环条件(我试图逐步完成此步骤),因为x(0)的第一个元素将不会被使用:

for i in range(1, len(x)):

该更改将阻止您使索引超出范围错误。接下来的交错添加:

for i in range(1, len(x)):
    y.append(y[i-1] + x[i])
return y

回到第一个追加示例。 for循环从索引1开始,其中x = 1,y没有值。要为y [1]创建一个值,你可以将索引0处的y加到索引1处的x,并给出4。循环继续,直到你用尽了x中的值,返回列表y中的累计值。 / p>