给定一个数字列表,例如:

[1, 2, 3, 4, 5, ...]

我如何计算它们的总和:

1 + 2 + 3 + 4 + 5 + ...

我如何计算他们的两两平均值:

[(1+2)/2, (2+3)/2, (3+4)/2, (4+5)/2, ...]

当前回答

保持简单:

def cool_sum(list: numbers):
    b = 0;
    for i in numbers:
        b += i
    return b;


a = [1, 2, 4]
print(cool_sum(a))

其他回答

这个问题在这里得到了解答

a = [1,2,3,4]
sum(a) 

sum(a)返回10

所有的回答都显示了一种纲领性和一般性的方法。我建议用一种数学方法来解决你的问题。它可以更快,特别是对于长列表。它之所以有效,是因为你的列表是一个到n的自然数列表:

假设我们有自然数1,2,3,…10:

>>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

你可以在列表中使用求和函数:

>>> print sum(nat_seq)
55

你也可以使用公式n*(n+1)/2,其中n是列表中最后一个元素的值(这里:nat_seq[-1]),这样你就可以避免遍历元素:

>>> print (nat_seq[-1]*(nat_seq[-1]+1))/2
55

生成序列(1+2)/2,(2+3)/2,…,(9+10)/2你可以使用生成器和公式(2*k-1)/2。(注意点使值为浮点)。在生成新列表时,必须跳过第一个元素:

>>> new_seq = [(2*k-1)/2. for k in nat_seq[1:]]
>>> print new_seq
[1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

在这里,你也可以使用列表中的sum函数:

>>> print sum(new_seq)
49.5

但是你也可以使用公式(((n*2+1)/2)**2-1)/2,这样你就可以避免遍历元素:

>>> print (((new_seq[-1]*2+1)/2)**2-1)/2
49.5

感谢Karl Knechtel,我能够理解你的问题。我的解释:

你想要一个包含元素i和i+1的平均值的新列表。 你需要对列表中的每个元素求和。

第一个问题使用匿名函数(又名。Lambda函数):

s = lambda l: [(l[0]+l[1])/2.] + s(l[1:]) if len(l)>1 else []  #assuming you want result as float
s = lambda l: [(l[0]+l[1])//2] + s(l[1:]) if len(l)>1 else []  #assuming you want floor result

第二个问题也使用匿名函数(aka。Lambda函数):

p = lambda l: l[0] + p(l[1:]) if l!=[] else 0

这两个问题合并在一行代码中:

s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0  #assuming you want result as float
s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0  #assuming you want floor result

使用最适合你需要的那个

使用简单的列表-理解和求和:

>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5

本着itertools的精神。灵感来自双人食谱。

from itertools import tee, izip

def average(iterable):
    "s -> (s0,s1)/2.0, (s1,s2)/2.0, ..."
    a, b = tee(iterable)
    next(b, None)
    return ((x+y)/2.0 for x, y in izip(a, b))

例子:

>>>list(average([1,2,3,4,5]))
[1.5, 2.5, 3.5, 4.5]
>>>list(average([1,20,31,45,56,0,0]))
[10.5, 25.5, 38.0, 50.5, 28.0, 0.0]
>>>list(average(average([1,2,3,4,5])))
[2.0, 3.0, 4.0]