我想编写一个函数,它接受数字列表并返回累积总和;也就是说,一个新列表,其中第 i 个元素是原始列表中第一个 i+1 元素的总和。例如,[1, 2, 3]
的累积总和为 [1, 3, 6]
。
这是我到目前为止的代码:
def count(list1):
x = 0
total = 0
while x < len(list1):
if x == 0:
total = list1[0]
print total
x = x +1
else:
total = list1[x] + list1[x -1]
print total
x = x + 1
return total
print count([1, 2, 3, 4, 7])
但是,它不起作用。
你能告诉我我做错了什么吗?我为此工作了很长一段时间。
你可能有点想多了这个过程。逻辑不需要真正拆分为这样的案例测试。到目前为止,您拥有的部分是总计数器,但您应该只需要遍历列表中的每个值。不做一个有条件的,如果..还
通常我不会只给出答案,但我觉得看到工作代码比尝试浏览到目前为止的额外和不必要的问题更有益。
def count(l):
total = 0
result = []
for val in l:
total += val
result.append(total)
return result
我们仍然使用总计数器。我们为结果创建一个空列表。但是我们所要做的就是遍历列表中的每个项目,添加到总数中,然后每次都附加新值。没有条件,您不必担心while
何时会破裂。您将循环访问原始列表中的每个项目是一致的。
在这里,您将当前索引与最后一个索引一起添加并覆盖"total"
total = list1[x] + list1[x -1]
我猜你想要这样的东西,它将为下面的列表返回 31。
def count(list1):
x = 0
total = 0
while x < len(list1):
total += list[x]
print total
x = x + 1
return total
list = [1, 2, 4, 8, 16]
print count(list)
一个简单的方法是
>>> given_list = [1, 4, 5, 8]
>>> output_list = [sum(given_list[:num]) for num in range(len(given_list)+1)]
>>> output_list
[0, 1, 5, 10, 18]
>>> output_list[1:]
[1, 5, 10, 18]
>>>
看看这是否适用于不同类型的列表。我把这个留给你。
你没有完全按照total
做你想做的事情。
您要total
设置的内容是 list[x] + list[x+1]
.你真的希望它是所有先前元素和当前元素的总和。
将total = list1[x] + list1[x-1]
替换为 total += list1[x]
。
你不需要写这个函数。它被放置在 itertools 模块中:
>>> list(itertools.accumulate([1,2,3]))
[1, 3, 6]
这是我提出的解决方案:
def count(list1):
total = 0
old = 0
for position, x in enumerate(list1):
total = x + old
old = x
print total
return
count([1,1,2,3,5,8,13])
另一种解决方案,单行,但绝对有效(http://ideone.com/qtwh7),即使多行解决方案更清楚这里真正发生的事情:
data = [3, 7, 22, -3, 5, -23, 16]
result = reduce(lambda a, b: a+[a[-1]+b], data, [0])[1:]
print result
我做了同样的练习,接下来是我的解决方案。它仅使用基本的append
列表方法和切片列表运算符。
def accum(list):
"""Sequential accumulation of the original list"""
result = []
for i in range(len(list)):
result.append(sum(list[:i+1]))
return result