我有一个数字列表,例如[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
获得一个号码?
这对我不起作用。
答案 0 :(得分:242)
问题1:你想要(元素0 +元素1)/ 2,(元素1 +元素2)/ 2,......等。
我们制作两个列表:除了第一个元素之外的每个元素之一,以及除了最后一个元素之外的每个元素之一。然后我们想要的平均值是从两个列表中取得的每对的平均值。我们使用zip
从两个列表中获取对。
我假设您希望在结果中看到小数,即使您的输入值是整数。默认情况下,Python执行整数除法:它会丢弃余数。为了将事情分开,我们需要使用浮点数。幸运的是,将一个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
此外,您不需要在整个过程的每一步都将所有内容分配给变量。 print sum(a)
工作正常。
您必须更准确地了解您所写的内容以及它的工作方式。
答案 1 :(得分:97)
数字总和:
sum(list_of_nums)
使用list comprehension计算n和n - 1的一半(如果我的模式正确):
[(x + (x - 1)) / 2 for x in list_of_nums]
对相邻元素求和,例如((1 + 2)/ 2)+((2 + 3)/ 2)+ ...使用reduce和lambdas
reduce(lambda x, y: (x + y) / 2, list_of_nums)
答案 2 :(得分:63)
问题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)
答案 3 :(得分:26)
您可以尝试这种方式:
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
答案 4 :(得分:24)
>>> 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
并覆盖了默认函数。所以我删除了它,问题就解决了。
答案 5 :(得分:16)
使用简单的list-comprehension
和sum
:
>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5
答案 6 :(得分:10)
所有答案都显示出一种程序化和一般性的方法。我建议采用针对您的情况的数学方法。对于长列表,它可以更快。这是有效的,因为您的列表是最多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
答案 7 :(得分:5)
解决此问题的最简单方法:
l =[1,2,3,4,5]
sum=0
for element in l:
sum+=element
print sum
答案 8 :(得分:2)
简短而简单:
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]
答案 9 :(得分:2)
生成器是一种简单的写法:
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]
答案 10 :(得分:2)
def parse_actor(self, response):
item = ImdbItem()
item['title'] = response.css('h3[itemprop~=name] a::text').extract_first()
item['actors'] = response.css('td[itemprop~=actor] span::text').extract()
return item
答案 11 :(得分:1)
我只使用带有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
答案 12 :(得分:1)
使用pairwise
itertools recipe:
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) )
答案 13 :(得分:1)
我使用while
循环来获得结果:
i = 0
while i < len(a)-1:
result = (a[i]+a[i+1])/2
print result
i +=1
答案 14 :(得分:1)
遍历列表中的元素并更新总数,如下所示:
def sum(a):
total = 0
index = 0
while index < len(a):
total = total + a[index]
index = index + 1
return total
答案 15 :(得分:1)
让我们简化了初学者的操作:-
global
关键字将允许在主函数中分配全局变量消息,而无需产生新的局部变量message = "This is a global!" def main(): global message message = "This is a local" print(message) main() # outputs "This is a local" - From the Function call print(message) # outputs "This is a local" - From the Outer scope
此概念称为阴影
nums = [1, 2, 3, 4, 5] var = 0 def sums(): for num in nums: global var var = var + num print(var) if __name__ == '__main__': sums()
输出= 15
答案 16 :(得分:1)
感谢 Karl Knechtel ,我能够理解您的问题。我的解释:
第一个问题,使用匿名函数(又名Lambda函数):
s = lambda l: [(l[0]+l[1])/2.] + s(l[1:]) if len(l)>1 else [] #assuming you want result as float
s = lambda l: [(l[0]+l[1])//2] + s(l[1:]) if len(l)>1 else [] #assuming you want floor result
第二个问题也使用匿名函数(又名Lambda函数):
p = lambda l: 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 #assuming you want result as float
s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0 #assuming you want floor result
使用最适合您需求的那个
答案 17 :(得分:0)
这么多解决方案,但我最喜欢的仍然缺失:
>>> 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的习惯,这对我原本必须制作的所有循环和内部循环都是一个巨大的改进。
答案 18 :(得分:0)
您也可以使用递归来做同样的事情:
Python代码段:
def sumOfArray(arr, startIndex):
size = len(arr)
if size == startIndex: # To Check empty list
return 0
elif startIndex == (size - 1): # To Check Last Value
return arr[startIndex]
else:
return arr[startIndex] + sumOfArray(arr, startIndex + 1)
print(sumOfArray([1,2,3,4,5], 0))
答案 19 :(得分:0)
此问题已得到解答here
a = [1,2,3,4] sum(a)返回10
答案 20 :(得分:0)
在Python 3.8中,可以使用新的赋值运算符
>>> my_list = [1, 2, 3, 4, 5]
>>> itr = iter(my_list)
>>> a = next(itr)
>>> [(a + (a:=x))/2 for x in itr]
[1.5, 2.5, 3.5, 4.5]
a
是对列表中上一个值的运行引用,因此它被初始化为列表的第一个元素,并且迭代发生在 rest 上。 em>,在每次迭代中使用后更新a
。
使用显式迭代器避免使用my_list[1:]
创建列表的副本。
答案 21 :(得分:0)
一种简单的方法是使用iter_tools排列
define( 'WP_MEMORY_LIMIT', '1024M' );
结果是:
# If you are given a list
numList = [1,2,3,4,5,6,7]
# and you are asked to find the number of three sums that add to a particular number
target = 10
# How you could come up with the answer?
from itertools import permutations
good_permutations = []
for p in permutations(numList, 3):
if sum(p) == target:
good_permutations.append(p)
print(good_permutations)
请注意,顺序很重要-意思是1、2、7也显示为2、1、7和7、1、2。您可以通过使用集合来减少这种情况。
答案 22 :(得分: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)
答案 23 :(得分: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]
答案 24 :(得分:0)
尝试使用列表理解。类似的东西:
new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]
答案 25 :(得分:-2)
尝试以下方法 -
mylist = [1, 2, 3, 4]
def add(mylist):
total = 0
for i in mylist:
total += i
return total
result = add(mylist)
print("sum = ", result)