在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

以获得一个数字?

这对我不起作用。

对该问题的评论 (3)

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

我们做两个列表:一个是除第一个元素外的每个元素,另一个是除最后一个元素外的每个元素。那么我们想要的平均数就是这两个列表中每一对的平均数。我们使用 "zip "从两个列表中取出一对。

我假设你想在结果中看到小数,尽管你的输入值是整数。默认情况下,Python 做的是整数除法:它抛弃了剩余部分。为了把东西全部除完,我们需要使用浮点数。幸运的是,用一个int除以一个float会产生一个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

另外,你不需要在每一步都把所有东西都分配给一个变量。print sum(a)就能正常工作。

你必须更具体地说明你到底写了什么,以及它是如何不工作的。

评论(4)

数字的总和列表。

sum(list_of_nums)

计算n和n-1的一半(如果我的模式正确的话),使用list comprehension

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

对相邻元素求和,例如:((1 + 2) / 2) + ((2 + 3) / 2) + ... 使用reducelambdas

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

问题2: 对整数列表进行求和。

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

如果列表中包含整数作为字符串。

a = ['5', '6']
# import Decimal: from decimal import Decimal
sum(Decimal(i) for i in a)
评论(2)

你可以试试这种方式。

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
评论(1)
>>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' object is not callable
>>> del sum
>>> sum(a)
45

似乎代码中某处定义了sum,并覆盖了默认函数。 所以我把它删除了,问题就解决了。

评论(0)

使用简单的 "列表理解 "和 "求和"。

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

所有的答案确实都显示出了一种程式化的一般方法。 我建议针对你的情况采用数学方法。 特别是对于长列表,它可以更快。 它的工作原理是,你的列表是一个自然数的列表,直到n

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

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

你可以在列表上使用sum函数。

>>> 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
评论(0)

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

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

让我们让初学者轻松一点:--------------------------------。

  1. global关键字将允许在主函数中分配全局变量信息,而不产生一个新的局部变量。

message = "这是一个全球性的!&quot。 这是一个全球性的!"。

def main():

全局消息

消息="这是一个本地&quot。

print(message)

main() &gt.#输出"这是本地"。

输出"这是一个本地&quot。

  • 从函数调用

打印(信息)

输出"这是一个本地&quot。

  • 从外部范围

这个概念叫做影子

  1. 在Python中对数字列表进行求和

nums = [1, 2, 3, 4, 5]

var = 0

def sums():

for num in nums:

全局变量

var = var + num

print(var)

if name == 'main': sums()

产出=15

评论(0)

简单明了。

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

>>> list(_)
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]
评论(2)

使用pairwiseitertools配方

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) )
评论(0)

生成器是一种简单的写法。

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]
评论(2)
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]
评论(0)

我使用while循环来得到结果。

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

循环浏览列表中的元素,并像这样更新总数。

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

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

  1. 你想要一个新的列表,其中包含元素i和i+1的平均值。
  2. 你想对列表中的每个元素进行求和。

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

s = lambda l.[(l[0]+l[1])/2.] + s(l[1:])
[(l[0]+l[1])/2.] + s(l[1:]) if len(l)>1 else [] #假设你希望结果为float。
s = lambda l.[(l[0]+l[1])/2] + s(l[1:])
[(l[0]+l[1])/2]+s(l[1:]) if len(l)>1 else [] #假设你想得到下限结果

第二个问题,也是使用匿名函数(又称Lambda函数)。 Lambda函数)。)

p = lambda l.L[0] + p(l[1:])
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 #假设你希望结果是浮动的
s=lambda l。
(l[0]+l[1])/2.
+ s(l[1:]) if len(l)>1 else 0 #假设你想得到下限结果

使用最适合你的需求的那一个

评论(0)

我用map()做一个lambda就可以了

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
评论(0)

本着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]
>>>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]
评论(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)
评论(0)

试着使用列表式理解法。比如说。

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