Quelle est la manière la plus idiomatique de réaliser quelque chose comme ce qui suit, dans Haskell:
foldl (+) 0 [1,2,3,4,5]
--> 15
Ou son équivalent en Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
De toute évidence, Python fournit la reduce
fonction, qui est une implémentation de fold, exactement comme ci-dessus, cependant, on m'a dit que la méthode de programmation `` pythonique '' était d'éviter les lambda
termes et les fonctions d'ordre supérieur, préférant les compréhensions de listes lorsque cela était possible. Par conséquent, existe-t-il un moyen préféré de plier une liste, ou une structure de type liste en Python qui n'est pas la reduce
fonction, ou est-ce reduce
la manière idiomatique d'y parvenir?
sum
, vous voudrez peut-être fournir différents types d'exemples.
sum()
fournit en fait des fonctionnalités limitées avec cela. sum([[a], [b, c, d], [e, f]], [])
renvoie [a, b, c, d, e, f]
par exemple.
+
sur les listes est une opération temporelle linéaire à la fois dans le temps et dans la mémoire, ce qui rend l'appel quadratique. L'utilisation list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])
est globalement linéaire - et si vous n'avez besoin de l'itérer qu'une seule fois, vous pouvez abandonner l'appel à list
pour le rendre constant en termes de mémoire.
sum
n'est pas assez bon?