Trouver les différences entre les éléments d'une liste
Donné une liste de nombres, comment trouver des différences entre chaque (i
)-th éléments et de ses (i+1
)-th?
Est-il préférable d'utiliser un lambda
expression ou peut-être une compréhension de liste?
Par exemple:
Donné une liste t=[1,3,6,...]
, l'objectif est de trouver une liste v=[2,3,...]
parce que 3-1=2
, 6-3=3
, etc.
InformationsquelleAutor psihodelia | 2010-03-08
Vous devez vous connecter pour publier un commentaire.
[abs(j-i) for i,j in zip(t, t[1:])]
list(itertools.starmap(operator.sub, zip(t[1:], t)))
(après l'importationitertools
etoperator
).list(map(operator.sub, t[1:], t[:-1]))
fera.Les autres réponses sont correctes, mais si vous faites numérique de travail, vous pourriez envisager de numpy. Utilisation de numpy, la réponse est:
np.diff([2,4,9])
serait[2,5]
Si vous ne souhaitez pas utiliser
numpy
nizip
, vous pouvez utiliser la solution suivante:Vous pouvez utiliser
itertools.té
etzip
efficacement construire le résultat:Ou à l'aide de
itertools.islice
à la place:Vous pouvez également éviter d'utiliser le
itertools
module:Toutes ces solution de travail en constante espace si vous n'avez pas besoin de stocker tous les résultats et le soutien infini iterables.
Voici quelques micro-benchmarks des solutions:
Et les autres solutions proposées:
Noter que:
zip(L[1:], L)
est équivalent àzip(L[1:], L[:-1])
depuiszip
déjà se termine sur la plus courte de l'entrée, mais il évite une copie entière deL
.numpy.diff
est lent, car il doit d'abord convertir lelist
à unndarray
. Évidemment, si vous commencer avec unndarray
il sera beaucoup plus rapide:islice(seq, 1, None)
au lieu deislice(seq, 1, len(seq))
permet de travailler avec une infinie iterablesOk. Je crois que j'ai trouvé la bonne solution:
Une approche fonctionnelle:
À l'aide du générateur:
À l'aide d'indices:
Je conseille
c'est simple et facile à lire.
Mais si vous voulez
v
d'avoir la même ligne quet
puisou
Pour info: cela ne fonctionne que pour les listes.
pour les tableaux numpy
Ma façon
enumerate
, c'est du gaspillage, car vous ne l'utilisez pasvalue
. Voir stackoverflow.com/a/16714453/832230