2

我想编写一个函数,它接受一个数字列表并返回累积和;也就是说,一个新列表,其中第 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])

但是,它不起作用。

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

4

8 回答 8

9

你可能有点过度思考这个过程。逻辑不需要真正分解成这样的案例测试。到目前为止,您拥有的部分是总计数器,但您应该只需要遍历列表中的每个值。不做有条件的while,用if..else

通常我不会只给出答案,但我觉得看到工作代码对你来说比尝试经历你迄今为止所拥有的额外和不必要的麻烦更有益。

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

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

于 2012-06-24T05:00:54.560 回答
2

在这里,您将当前索引与最后一个索引相加并覆盖“总计”

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)
于 2012-06-24T05:01:53.193 回答
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]
>>> 

看看这是否适用于不同类型的列表。我把它留给你。

于 2012-06-24T04:59:59.097 回答
1

你没有做你想做的事total

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

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

于 2012-06-24T05:01:05.637 回答
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])
于 2012-06-24T05:58:55.390 回答
1

你不需要编写这个函数。它被放置在 itertools 模块中:

>>> list(itertools.accumulate([1,2,3]))
[1, 3, 6]
于 2012-06-24T06:05:33.997 回答
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
于 2012-06-24T06:12:40.893 回答
0

我做了同样的练习,下面是我的解决方案。它仅使用基本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
于 2014-02-28T03:26:28.027 回答