我有一些代码执行以下操作,但我想知道是否有更有效和可理解的方法来执行此操作。我认为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
有什么想法吗?
答案 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>