Qual è il modo più idiomatico per ottenere qualcosa di simile, in Haskell:
foldl (+) 0 [1,2,3,4,5]
--> 15
O il suo equivalente in Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Ovviamente, Python fornisce la reduce
funzione, che è un'implementazione di fold, esattamente come sopra, tuttavia, mi è stato detto che il modo "pitonico" di programmazione era quello di evitare lambda
termini e funzioni di ordine superiore, preferendo la comprensione di elenchi ove possibile. Pertanto, esiste un modo preferito per piegare una lista, o una struttura simile a una lista in Python che non è la reduce
funzione, o è reduce
il modo idiomatico per ottenere ciò?
sum
, potresti voler fornire alcuni diversi tipi di esempi.
sum()
fornisce effettivamente funzionalità limitate con questo. sum([[a], [b, c, d], [e, f]], [])
ritorna [a, b, c, d, e, f]
per esempio.
+
sulle liste è un'operazione di tempo lineare sia nel tempo che nella memoria, rendendo l'intera chiamata quadratica. L'utilizzo list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])
è nel complesso lineare e se è necessario iterarlo solo una volta, è possibile eliminare la chiamata a list
per renderlo costante in termini di memoria.
sum
non è abbastanza buono?