为了证明我做了某事。 这是我的代码总和三行。
l=[1,2,3,4,5];
sum=0
for i in l:
sum+=i*i;
print sum
我很好奇,我可以只用一行吗?
答案 0 :(得分:17)
是的,你可以。这是使用sum
函数:
l = [1,2,3,4,5]
print(sum(i*i for i in l))
答案 1 :(得分:11)
怎么样:
sum(map(lambda x:x*x,l))
我们还使用reduce
:
print reduce(lambda x,y: x+y*y,l) # as pointed by @espang reduce(lambda x,y: x+y*y,l) is only ok, when the first value is 1 (because 1*1 == 1). The first value is not squared
我们可以取第一个元素,得到它的方块,然后将它添加到列表的头部,这样我们就可以确保它是平方的。然后我们继续使用reduce。由于我们有更好的选择,所以这项工作并不值得。
reduce(lambda x,y: x+y*y,[l[:1][0]**2]+l[1:])
出于好奇,我试图比较三个解决方案,以求10000
生成的range
个数的平方和,并计算每个操作的执行时间。
l=range(10000)
from datetime import datetime
start_time = datetime.now()
print reduce(lambda x,y: x+y*y,l)
print('using Reduce numbers: {}'.format(datetime.now() - start_time))
from datetime import datetime
start_time = datetime.now()
print sum(map(lambda x:x*x,l))
print('Sum after map square operation: {}'.format(datetime.now() - start_time))
from datetime import datetime
start_time = datetime.now()
print sum( i*i for i in l)
print('using list comprehension to sum: {}'.format(datetime.now() - start_time))
输出:
使用list comprehension
更快
333283335000
using Reduce numbers: 0:00:00.003371
333283335000
Sum after map square operation: 0:00:00.002044
333283335000
using list comprehension to sum: 0:00:00.000916
答案 2 :(得分:7)
对于更大的列表,当性能很重要时,你应该使用numpy:
import numpy as np
l = [1,2,3,4,5]
arr = np.array(l)
np.sum(arr**2)
# or better:
np.dot(arr, arr)
答案 3 :(得分:0)
您可以定义一个功能并使用列表理解
l = [2, 6, 10, 12, 16, 20]
def sumOfSquares(alist):
return ((sum([i**2 for i in alist]))-(sum(alist)**2)/len(alist))
print(sumOfSquares(l))