Python 条件while循环来计算累计和?

Python 条件while循环来计算累计和?,python,while-loop,cumulative-sum,Python,While Loop,Cumulative Sum,我想写一个函数,它接受一个数字列表并返回累计和;也就是说,一个新列表,其中第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

我想写一个函数,它接受一个数字列表并返回累计和;也就是说,一个新列表,其中第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计数(列表1):
x=0
总数=0
当x
然而,它不起作用


你能告诉我我做错了什么吗?我已经为此工作了很长一段时间。

一个简单的方法是

>>> 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计数器,但您应该只需要循环列表中的每个值。不执行条件while,使用if..else

通常我不会只是给出一个答案,但我觉得对您来说,查看工作代码比尝试检查到目前为止的额外和不必要的错误更有益

def count(l):
    total = 0
    result = []
    for val in l:
        total += val
        result.append(total)
    return result

我们仍然使用总计数器。我们为结果创建一个空列表。但我们所要做的就是循环列表中的每个项目,将其添加到总数中,并每次追加新值。这里没有条件,您不必担心
while
何时会中断。您将循环查看原始列表中的每个项目,这是一致的。

您没有完全按照您希望的方式使用
total

您要设置的
total
list[x]+list[x+1]
。您确实希望它是所有先前元素和当前元素的总和


total=list1[x]+list1[x-1]
替换为
total+=list1[x]

这里您将用最后一个索引添加当前索引并覆盖“total”

我猜你想要这样的东西,下面的列表会返回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)
def计数(列表1):
x=0
总数=0
当x
这是我提出的解决方案:

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])

您不需要编写此函数。它位于itertools模块中:

>>> list(itertools.accumulate([1,2,3]))
[1, 3, 6]

另一种解决方案,一行,但肯定有效(),尽管多行解决方案更清楚地说明了此处实际发生的情况:

data = [3, 7, 22, -3, 5, -23, 16]

result = reduce(lambda a, b: a+[a[-1]+b], data, [0])[1:]

print result

我做了同样的练习,下面是我的解决方案。它只使用基本的
append
list方法和slice list操作符

def accum(list):
    """Sequential accumulation of the original list"""
    result = []
    for i in range(len(list)):
        result.append(sum(list[:i+1]))
    return result


这个代码比它需要的要复杂得多:/“我不是很聪明。”不要把缺乏经验和缺乏智慧混为一谈,或者担心我们会把它们混为一谈,因此觉得你必须为不理解某些东西而事先道歉。每个人都曾经是初学者,人们不是天生就懂Python的。无论如何,还没有..++1!根据@DSM的评论。。人们似乎经常忘记这一点(在这里也经常忘记)。谢谢你的评论,DSM。非常感谢你。对于初学者来说,这太复杂了,无法想象OP会得到它。我很惭愧尝试了这种方法。谢谢你的建议,pyfunc。这对我来说有点太复杂了,但是谢谢你的帮助。如果我更聪明,我相信我会理解得更好@LukeD:有很多非常有趣的方法可以用更少的代码计算东西。你最终会遇到列表理解的问题。@LukeD:这根本不是为了变得聪明。它是关于学习、坚持和努力工作的。我想我们都可以尝试一下。有了SO的一点帮助,学习会变得愉快。非常感谢您的回答!这很有道理!我正在读《思考Python:如何像计算机科学家一样思考》一书,我已经学到了很多东西。再次非常感谢!你真是帮了大忙@卢克德:没问题!我认为这与你迄今为止可能接触过的术语非常接近。祝你好运如果你需要更多的澄清,请告诉我。我会的,先生。再次感谢你,你真的帮了我很大的忙。我不得不用一种不同的方式思考这个问题,正如你所做的那样。谢谢。谢谢你的评论!这很有帮助!谢谢您已经在问题的代码中发现了一个潜在问题。但是,您的函数返回列表内容的总和,而不是问题中要求的具有累积总和的新列表。谢谢您的建议!我试过了,但没用。但它确实有帮助,谢谢你!这可以在没有连接的情况下完成:
reduce(lambda r,x:r.append(r[-1]+x)或r,data[0])[1:
甚至没有索引
reduce(lambda(res,sum),x:(res.append(sum+x)或res.append(sum+x),data,([],0)][0]
我的第一(第二)个变量与
len(data)==1000
相比快了7(6)倍,而且内存效率更高:)@astynax:你可能是对的,但我觉得很奇怪;)它的数量级是多少,快7倍还是76倍不过,您可以尝试以类似的方式使用
map()
。而且它可能(应该?)更快。第一个是7倍,第二个是6倍。对于len(data)==10000:first-45倍快,second-35倍快),我认为对这个简洁代码的解释是helpful@Levon函数的名称(累积)是自解释的。因为它是一个生成器,我在上面调用了
list
。是的,我知道。。鉴于OP的问题,我认为向他们提供一些最低限度的解释(例如,一行)会有所帮助——仅此而已:)并非每个人都对我们的建议感到满意
def accum(list):
    """Sequential accumulation of the original list"""
    result = []
    for i in range(len(list)):
        result.append(sum(list[:i+1]))
    return result