我想写一个函数,它接受一个数字列表并返回累积和;也就是说,一个新的列表,其中第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])
然而,它不起作用。
你能告诉我我做错了什么吗?我现在已经有很长一段时间了。非常感谢!
路
答案 0 :(得分:9)
你可能会过度思考这个过程。逻辑不需要真正分成像这样的案例测试。到目前为止您所拥有的部分是总计数器,但您只需要遍历列表中的每个值。使用if..else
时不要使用条件通常情况下,我不会给出答案,但我觉得看到工作代码比试图通过你迄今为止的额外和不必要的瑕疵更有利于你。
def count(l):
total = 0
result = []
for val in l:
total += val
result.append(total)
return result
我们仍然使用总计数器。我们为结果创建一个空列表。但我们所要做的就是遍历列表中的每个项目,添加到总计,并每次追加新值。没有条件,您不必担心while
何时会破坏。您将在原始列表中循环遍历每个项目,这是一致的。
答案 1 :(得分:2)
在这里,您要将当前索引与最后一个索引相加并覆盖“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)
答案 2 :(得分:1)
一种简单的方法可以是
>>> 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]
>>>
看看这是否适用于不同类型的列表。我把它留给你。
答案 3 :(得分:1)
你没有完全按照total
做的事情。
您设置total
的内容是list[x] + list[x+1]
。你真的希望它是所有之前元素和当前元素的总和。
将total = list1[x] + list1[x-1]
替换为total += list1[x]
。
答案 4 :(得分:1)
这是我提出的解决方案:
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])
答案 5 :(得分:1)
您无需编写此功能。它放在itertools模块中:
>>> list(itertools.accumulate([1,2,3]))
[1, 3, 6]
答案 6 :(得分:1)
另一个解决方案,一线,但绝对有效(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
答案 7 :(得分:0)
我做了同样的练习,接下来是我的解决方案。它仅使用基本的append
列表方法和 slice 列表运算符。
def accum(list):
"""Sequential accumulation of the original list"""
result = []
for i in range(len(list)):
result.append(sum(list[:i+1]))
return result