¿Cuál es la forma más idiomática de lograr algo como lo siguiente, en Haskell:
foldl (+) 0 [1,2,3,4,5]
--> 15
O su equivalente en Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Obviamente, Python proporciona la reducefunción, que es una implementación de fold, exactamente como arriba, sin embargo, me dijeron que la forma 'pitónica' de programar era evitar lambdatérminos y funciones de orden superior, prefiriendo listas por comprensión cuando fuera posible. Por lo tanto, ¿hay una forma preferida de plegar una lista o una estructura similar a una lista en Python que no sea la reducefunción, o es reducela forma idiomática de lograr esto?
sum, es posible que desee proporcionar algunos tipos diferentes de ejemplos.
sum()realidad, proporciona una funcionalidad limitada con esto. sum([[a], [b, c, d], [e, f]], [])devuelve, [a, b, c, d, e, f]por ejemplo.
+en las listas es una operación de tiempo lineal tanto en tiempo como en memoria, lo que hace que toda la llamada sea cuadrática. El uso list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])es lineal en general, y si solo necesita iterar sobre él una vez, puede eliminar la llamada a listpara que sea constante en términos de memoria.
sumno es lo suficientemente bueno?