web-dev-qa-db-fra.com

somme de carrés dans une liste sur une ligne?

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?

10
AlexWei

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

Oui, vous pouvez. Ici, il utilise la fonction sum:

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

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)
6
espang

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