在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-comprehension
和sum
:
>> 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]
您可以在列表中使用sum
function:
>>> 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