2010-05-08 8 views
1

Comment écrivez-vous une liste de compréhension en python pour générer une série de deltas n-1 entre n éléments dans une liste ordonnée?Compréhension de liste pour les séries de deltas

Exemple:

L = [5,9,2,1,7] 
RES = [5-9,9-2,2-1,1-7] = [4,7,1,6] # absolute values 
+0

Quelle version de Python? –

Répondre

5
RES = [abs(L[i]-L[i+1]) for i in range(len(L)-1)] 
4

La section recipes du itertools documentation inclut le code source pour une fonction appelée par paire que vous pouvez utiliser à cet effet:

from itertools import * 

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

Vous pouvez copier et coller dans votre fichier. Cette fonction définie, il est assez simple à faire ce que vous voulez:

l = [5, 9, 2, 1, 7] 
print [abs(a-b) for a,b in pairwise(l)] 

Résultat

[4, 7, 1, 6] 
2

Juste figured it out:

[abs(x-y) for x,y in zip(L[:-1], L[1:])] 
+0

Pour les grandes listes, vous pouvez utiliser itertools.izip au lieu de zip. http://docs.python.org/library/itertools.html#itertools.izip –

+2

Je n'aime pas la duplication inutile de la liste originale. –