2011-03-15 9 views
18

Eventuali duplicati:
Python - Differences between elements of a listDifferenza tra elementi consecutivi nell'elenco

Ho una lista e vorrei trovare differenza tra elementi consecutivi:

a = [0, 4, 10, 100] 
find_diff(a) 
>>> [4,6,90] 

Come sarebbe codice funzione find_diff()? Posso codificarlo con "for" iterator ma sono sicuro che ci sono modi molto semplici per farlo con una semplice fodera.

+0

hmm, stavo per accettare la prima risposta, ma vedo che viene eliminato ora. – gok

+0

Come avrebbe dovuto essere, dato che quella domanda chiede ** esattamente la stessa cosa **. –

+0

quindi dovrei cancellare questa domanda? Non ho trovato quello in cerca prima di chiedere – gok

risposta

28

Si potrebbe utilizzare enumerate, zip e list comprehensions:

>>> a = [0, 4, 10, 100] 

# basic enumerate without condition: 
>>> [x - a[i - 1] for i, x in enumerate(a)][1:] 
[4, 6, 90] 

# enumerate with conditional inside the list comprehension: 
>>> [x - a[i - 1] for i, x in enumerate(a) if i > 0] 
[4, 6, 90] 

# the zip version seems more concise and elegant: 
>>> [t - s for s, t in zip(a, a[1:])] 
[4, 6, 90] 

delle prestazioni, sembra che ci sia non troppo varianza:

In [5]: %timeit [x - a[i - 1] for i, x in enumerate(a)][1:] 
1000000 loops, best of 3: 1.34 µs per loop 

In [6]: %timeit [x - a[i - 1] for i, x in enumerate(a) if i > 0] 
1000000 loops, best of 3: 1.11 µs per loop 

In [7]: %timeit [t - s for s, t in zip(a, a[1:])] 
1000000 loops, best of 3: 1.1 µs per loop 
16

Utilizzare il recipe for pairwise dalla documentazione itertools:

from itertools import izip, tee 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

Uso in questo modo:

>>> a = [0, 4, 10, 100] 
>>> [y-x for x,y in pairwise(a)] 
[4, 6, 90] 
+1

Questo è completamente inutile. Vedi [Python - Differenze tra gli elementi di una lista] (http://stackoverflow.com/questions/2400840/python-differences-between-elements-of-a-list). –

+12

@Matt Ball: molti iteratori possono essere chiamati "non necessari", ma una volta definiti, sono dannatamente utili per gli idiomi comuni. Perché chiedere al lettore di estrarre un zip di due fette quando possiamo assegnare un nome utile all'idea come 'pairwise'. Non penso di essere il solo a pensarlo come ho sollevato l'esempio direttamente dai documenti. –

+0

+! Questa versione funziona per generatori arbitrari, che non possono essere suddivisi/indicizzati. – avmohan

3
[x - a[i-1] if i else None for i, x in enumerate(a)][1:] 
Problemi correlati