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

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

我如何计算它们的总和:

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

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

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

当前回答

遍历列表中的元素并像这样更新总数:

def sum(a):
    total = 0
    index = 0
    while index < len(a):
        total = total + a[index]
        index = index + 1
    return total

其他回答

简短而简单:

def ave(x,y):
  return (x + y) / 2.0

map(ave, a[:-1], a[1:])

这是它的样子:

>>> a = range(10)
>>> map(ave, a[:-1], a[1:])
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]

由于Python在处理两个列表上的映射时有些愚蠢,你必须截断列表a[:-1]。如果你使用itertools.imap,它会像你期望的那样工作:

>>> import itertools
>>> itertools.imap(ave, a, a[1:])
<itertools.imap object at 0x1005c3990>
>>> list(_)
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]

问题1:

要对一组数字求和,使用sum:

xs = [1, 2, 3, 4, 5]
print(sum(xs))

这个输出:

15

问题2:

所以你需要(元素0 +元素1)/ 2,(元素1 +元素2)/ 2,…等。

我们做两个列表:一个是除第一个元素之外的所有元素,一个是除最后一个元素之外的所有元素。我们想要的平均值是从这两个表中取的每对的平均值。我们使用zip从两个列表中获取对。

我假设您希望在结果中看到小数,即使您的输入值是整数。默认情况下,Python执行整数除法:它会丢弃余数。要一直除以,我们需要使用浮点数。幸运的是,整型数除以浮点数将产生一个浮点数,所以我们只使用2.0而不是2作为除数。

因此:

averages = [(x + y) / 2.0 for (x, y) in zip(my_list[:-1], my_list[1:])]

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

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

你可以试试这种方法:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sm = sum(a[0:len(a)]) # Sum of 'a' from 0 index to 9 index. sum(a) == sum(a[0:len(a)]
print(sm) # Python 3
print sm  # Python 2