2013-01-03 18 views
13

In Python 3.3, itertools.accumulate(), che normalmente applica ripetutamente un'operazione di aggiunta all'iterable fornito, ora può assumere un argomento di funzione come parametro; questo significa che ora si sovrappone a functools.reduce(). Con uno sguardo superficiale, le principali differenze tra i due ora sembrerebbero essere:itertools.accumulate() versus functools.reduce()

  1. accumulate() default somma, ma non consente di fornire una condizione iniziale in più esplicitamente mentre reduce() non predefinita a qualsiasi metodo, ma lo fa puoi fornire una condizione iniziale per l'utilizzo di 1/sequenze 0-elemento, e 2)
  2. accumulate() prende il primo iterabile mentre reduce() calcia la funzione prima

Esistono altre differenze tra i due? O è solo una questione di comportamento di due funzioni con usi inizialmente distinti che iniziano a convergere nel tempo?

+1

accumula esegue una scansione https://en.wikipedia.org/wiki/Prefix_sum mentre riduce esegue una piega https://en.wikipedia.org/wiki/Fold_(higher-order_function) –

risposta

17

Sembra che accumulate mantenga i risultati precedenti, mentre reduce (che è noto come piega in altre lingue) non necessariamente.

ad es. list(accumulate([1,2,3], operator.plus)) restituirebbe [1,3,6] mentre una piega pianura sarebbe tornato 6

anche (solo per divertimento, non farlo) è possibile definire accumulate in termini di reduce

def accumulate(xs, f): 
    return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]]) 
+2

Immagino tu intenda l'operatore .add'. Inoltre, non so se l'ultimo snippet sia veramente utile: 1) restituisce una lista mentre 'itertools.accumulate' restituisce un iterable, 2) è terribilmente inefficiente :) – tokland

6

Si può vedere nella documentazione di ciò che il la differenza è reduce restituisce un risultato singolo, la somma, il prodotto, ecc. Della sequenza. accumulate restituisce un iteratore su all ' i risultati intermedi. Fondamentalmente, accumulate restituisce un iteratore sui risultati di ciascun passaggio dell'operazione reduce.

2

è come reduce ma restituisce un generatore * invece di un valore. Questo generatore può darti tutti i valori intermedi del passo. Quindi in pratica ridurre ti dà l'ultimo elemento di ciò che ti darà l'accumulo.

* Un generatore è come un iteratore ma può essere ripetuto solo una volta.