2011-03-15 10 views
18

Possible en double:
Python - Differences between elements of a listdifférence entre les éléments consécutifs dans la liste

J'ai une liste et je veux trouver la différence entre les éléments consécutifs:

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

Comment serait vous codez la fonction find_diff()? Je peux coder ceci avec "pour" itérateur mais je suis sûr qu'il y a des manières très simples de le faire avec un simple doublure.

+0

hmm, je vais accepter la première réponse, mais je vois qu'il est maintenant supprimé. – gok

+0

Aussi bien qu'il aurait dû être, puisque cette question demande ** exactement la même chose **. –

+0

alors devrais-je supprimer cette question? Je ne pouvais pas trouver celui-ci dans la recherche avant de demander – gok

Répondre

28

Vous pouvez utiliser enumerate, zip et 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] 

Côté performance, il semble y avoir pas trop écart:

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

Utilisez le recipe for pairwise de la documentation 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) 

Utilisation comme ceci:

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

C'est complètement inutile. Voir [Python - Différences entre les éléments d'une liste] (http://stackoverflow.com/questions/2400840/python-differences-between-elements-of-a-list). –

+12

@Matt Ball: Beaucoup d'itérateurs peuvent être appelés "inutiles", mais une fois définis, ils sont utiles pour les idiomes courants. Pourquoi demander au lecteur d'extraire un zip de deux tranches quand on peut assigner un nom utile à l'idée comme 'pairwise'. Je ne pense pas que je suis seul à penser cela car j'ai pris l'exemple directement des docs. –

+0

+! Cette version fonctionne pour les générateurs arbitraires, qui ne peuvent pas être découpés/indexés. – avmohan

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