Qual é a maneira mais idiomática de conseguir algo como o seguinte, em Haskell:
foldl (+) 0 [1,2,3,4,5]
--> 15
Ou seu equivalente em Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Obviamente, Python fornece a reduce
função, que é uma implementação de fold, exatamente como acima, no entanto, fui informado que a maneira 'pítônica' de programação era evitar lambda
termos e funções de ordem superior, preferindo compreensões de lista quando possível. Portanto, há uma maneira preferida de dobrar uma lista, ou estrutura semelhante a uma lista em Python que não seja a reduce
função, ou é reduce
a maneira idiomática de fazer isso?
sum
, você pode fornecer alguns tipos diferentes de exemplos.
sum()
na verdade, fornece funcionalidade limitada com isso. sum([[a], [b, c, d], [e, f]], [])
retorna [a, b, c, d, e, f]
por exemplo.
+
em listas é uma operação de tempo linear tanto no tempo quanto na memória, tornando toda a chamada quadrática. O uso list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])
é linear no geral - e se você só precisar iterar sobre ele uma vez, pode cancelar a chamada para list
para torná-lo constante em termos de memória.
sum
não é bom o suficiente?