私がsthを行ったことを示すために。これは私のコードが3行で合計されます。
l=[1,2,3,4,5];
sum=0
for i in l:
sum+=i*i;
print sum
たった1行でそれを行うことができますか?
について:
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
はい、できます。ここでは、sum
関数を使用しています。
l = [1,2,3,4,5]
print(sum(i*i for i in l))
より大きなリストとパフォーマンスが重要な場合は、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)
関数を定義してリスト内包表記を使用できます
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))