在Python中总结一个数字列表

如果我有[1,2,3,4,5...]这样的数字列表,我想计算(1+2)/2 ,第二, (2+3)/2和第三, (3+4)/2等等。

我怎样才能做到这一点? 我想把第一个数字和第二个数字相加,然后除以2,然后把第二个数字与第三个数字相加,再除以2,等等。

另外,我怎样才能总结一个数字列表?

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

是吗:

 b = sum(a) print b 

得到一个号码? 这对我不起作用。 请帮帮我。

问题1:所以你想(元素0 +元素1)/ 2,(元素1 +元素2)/ 2,等等

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

编辑:我假设你想在结果中看到小数,即使你的input值是整数。 默认情况下,Python会进行整数除法:丢弃余数。 为了将事物分解,我们需要使用浮点数。 幸运的是,用float分隔一个int将产生一个float,所以我们只用了2.0作为除数而不是2

从而:

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

问题2:

sum使用应该工作正常。 以下工作:

 a = range(10) # [0,1,2,3,4,5,6,7,8,9] b = sum(a) print b # prints 45 

另外,你不需要在每一步中把所有的东西都分配给一个variables。 print sum(a)工作得很好。

你将不得不更加具体地说明你写的是什么,以及它是如何工作的。

总数列表:

 sum(list_of_nums) 

计算n和n – 1的一半(如果我的模式是正确的),使用列表理解 :

 [(x + (x - 1)) / 2 for x in list_of_nums] 

使用reduce和lambda来求和相邻元素,例如((1 + 2)/ 2)+((2 + 3)/ 2)+ …

 reduce(lambda x, y: (x + y) / 2, list_of_nums) 

问题2:总结一个整数列表:

 a = [2, 3, 5, 8] sum(a) # 18 # or you can do: sum(i for i in a) # 18 

如果列表包含整数作为string:

 a = ['5', '6'] # import Decimal: from decimal import Decimal sum(Decimal(i) for i in a) 
 >>> a = range(10) >>> sum(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable >>> del sum >>> sum(a) 45 

看来sum已经在代码中定义了,并覆盖了默认的函数。 所以我删除了它,问题解决了。

使用一个简单的list-comprehensionsum

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

解决这个问题最简单的方法是:

 l =[1,2,3,4,5] sum=0 for element in l: sum+=element print sum 

你可以试试这个方法

 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 

所有的答案都显示了一个程序化和一般的方法。 我build议一个特定于你的情况的math方法。 长列表可能会更快。 它的工作原理是因为你的列表是最多n自然数的列表:

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

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

您可以在列表中使用sumfunction:

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

发电机是一个简单的方法来写这个:

 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] 

我使用while循环来获得结果

 i=0 while i <len(a)-1: result=(a[i]+a[i+1])/2 print result i +=1 

使用pairwise itertools配方 :

 import itertools def pairwise(iterable): "s -> (s0,s1), (s1,s2), (s2, s3), ..." a, b = itertools.tee(iterable) next(b, None) return itertools.izip(a, b) def pair_averages(seq): return ( (a+b)/2 for a, b in pairwise(seq) ) 

简单而简单:

 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在两个列表中处理map方式有些愚蠢,所以您必须截断列表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] 
 mylist=[1,2,3,4] total=0 def add(mylist): for i in mylist: total+=i return total result=add(mylist) print("sum = ",result) 
 import numpy as np x = [1,2,3,4,5] [(np.mean((x[i],x[i+1]))) for i in range(len(x)-1)] # [1.5, 2.5, 3.5, 4.5] 

尝试使用列表理解。 就像是:

 new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))] 

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

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

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

我只是用一个lambda与map()

 a = [1,2,3,4,5,6,7,8,9,10] b = map(lambda x, y: (x+y)/2.0, fib[:-1], fib[1:]) print b