一行列表中的平方和?

2024-05-17 18:04:55 发布

您现在位置:Python中文网/ 问答频道 /正文

证明我做了某事。 这是我的三行代码。

l=[1,2,3,4,5];
sum=0

for i in l:
    sum+=i*i;
print sum

我很好奇我能不能只用一行字?


Tags: 代码in证明forsumprint
3条回答

是的,你可以。这里使用的是sum函数:

l = [1,2,3,4,5]
print(sum(i*i for i in l))

怎么办:

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

出于好奇,我试着比较这三个解,求出由range生成的10000个数的平方和,并计算出每个操作的执行时间。

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

对于更大的列表和性能问题,您应该使用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)

相关问题 更多 >