web-dev-qa-db-ja.com

1行のリストの平方和?

私がsthを行ったことを示すために。これは私のコードが3行で合計されます。

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

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

たった1行でそれを行うことができますか?

12
AlexWei

について:

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

好奇心から、私は3つのソリューションを比較して、rangeによって生成された10000数値の2乗を合計し、すべての操作の実行時間を計算しようとしました。

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
13
user4179775

はい、できます。ここでは、sum関数を使用しています。

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

より大きなリストとパフォーマンスが重要な場合は、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)
9
espang

関数を定義してリスト内包表記を使用できます

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))
0
MattP