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

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

我如何计算它们的总和:

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

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

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

当前回答

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

其他回答

n = int(input("Enter the length of array: "))
list1 = []
for i in range(n):
    list1.append(int(input("Enter numbers: ")))
print("User inputs are", list1)

list2 = []
for j in range(0, n-1):
    list2.append((list1[j]+list1[j+1])/2)
print("result = ", list2)

生成器是一种简单的编写方法:

from __future__ import division
# ^- so that 3/2 is 1.5 not 1

def averages( lst ):
    it = iter(lst) # Get a iterator over the list
    first = next(it)
    for item in it:
        yield (first+item)/2
        first = item

print list(averages(range(1,11)))
# [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

这么多解决方案,但我最喜欢的还是没有:

>>> import numpy as np
>>> arr = np.array([1,2,3,4,5])

numpy数组与列表没有太大区别(在这个用例中),除了你可以像对待数字一样对待数组:

>>> ( arr[:-1] + arr[1:] ) / 2.0
[ 1.5  2.5  3.5  4.5]

完成了!

解释

花式索引的意思是:[1:]包括从1到最后的所有元素(因此省略了元素0),而[:-1]是除了最后一个以外的所有元素:

>>> arr[:-1]
array([1, 2, 3, 4])
>>> arr[1:]
array([2, 3, 4, 5])

将这两个元素相加,就得到了一个包含元素(1+2)(2+3)等的数组。 请注意,我是除以2.0,而不是2,因为否则Python认为您只使用整数并产生四舍五入的整数结果。

使用numpy的优点

Numpy比围绕数字列表的循环要快得多。这取决于你的列表有多大,快几个数量级。此外,它的代码更少,至少对我来说,它更容易阅读。 我正在努力养成对所有数字组都使用numpy的习惯,这对于我本来必须编写的所有循环和循环中的循环是一个巨大的改进。

保持简单:

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