¿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 reduce
función, que es una implementación de fold, exactamente como arriba, sin embargo, me dijeron que la forma 'pitónica' de programar era evitar lambda
té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 reduce
función, o es reduce
la 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 list
para que sea constante en términos de memoria.
sum
no es lo suficientemente bueno?