Pour démontrer que j’ai fait qch ..__, c’est mon code qui se résume en trois lignes.
l=[1,2,3,4,5];
sum=0
for i in l:
sum+=i*i;
print sum
Je suis curieux puis-je le faire en une seule ligne?
Qu'en est-il de :
sum(map(lambda x:x*x,l))
nous utilisons aussi 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
Nous pouvons prendre le premier élément, obtenir son carré, puis l'ajouter en tête de liste pour nous assurer qu'il est bien carré. Ensuite, nous continuons à utiliser réduire. Cela ne vaut pas tout ce travail, car nous avons de meilleures alternatives.
reduce(lambda x,y: x+y*y,[l[:1][0]**2]+l[1:])
Juste par curiosité, j’ai essayé de comparer les trois solutions pour additionner les carrés des nombres 10000
générés par range
et calculer le temps d’exécution de chaque opération.
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))
Sortie:
Utiliser list comprehension
est plus rapide
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
Oui, vous pouvez. Ici, il utilise la fonction sum
:
l = [1,2,3,4,5]
print(sum(i*i for i in l))
Pour une plus grande liste et lorsque les performances comptent, vous devez utiliser 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)
Vous pouvez définir une fonction et utiliser la compréhension de liste
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))