Étant donné une liste de nombres, comment trouver des différences entre chaque ( i
) -ième élément et son ( i+1
) -th?
Vaut-il mieux utiliser une lambda
expression ou peut-être une compréhension de liste?
Par exemple:
Compte tenu de la liste t=[1,3,6,...]
, l'objectif est de trouver une liste v=[2,3,...]
parce que 3-1=2
, 6-3=3
etc.
[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]))
, cela fera tout simplement l'affaire.Les autres réponses sont correctes, mais si vous faites du travail numérique, vous voudrez peut-être considérer numpy. En utilisant numpy, la réponse est:
la source
np.diff([2,4,9])
serait[2,5]
zip
version?Si vous ne souhaitez pas utiliser
numpy
nizip
, vous pouvez utiliser la solution suivante:la source
Vous pouvez utiliser
itertools.tee
etzip
créer efficacement le résultat:Ou en utilisant à la
itertools.islice
place:Vous pouvez également éviter d'utiliser le
itertools
module:Toutes ces solutions fonctionnent dans un espace constant si vous n'avez pas besoin de stocker tous les résultats et de prendre en charge des itérables infinis.
Voici quelques micro-benchmarks des solutions:
Et les autres solutions proposées:
Notez que:
zip(L[1:], L)
est équivalent àzip(L[1:], L[:-1])
puisque sezip
termine déjà sur l'entrée la plus courte, mais il évite une copie complète deL
.numpy.diff
est lent car il doit d'abord convertir lelist
en andarray
. Évidemment, si vous commencez par un,ndarray
ce sera beaucoup plus rapide:la source
islice(seq, 1, None)
au lieu de leislice(seq, 1, len(seq))
faire fonctionner avec des itérables infinisUtilisation de l'
:=
opérateur morse disponible dans Python 3.8+:la source
Je suggérerais d'utiliser
c'est simple et facile à lire.
Mais si vous voulez
v
avoir la même longueurt
qu'alorsou
FYI: cela ne fonctionnera que pour les listes.
pour les tableaux numpy
la source
Une approche fonctionnelle:
Utilisation du générateur:
Utilisation d'indices:
la source
D'accord. Je pense avoir trouvé la bonne solution:
la source
Solution avec des limites périodiques
Parfois, avec l'intégration numérique, vous voudrez différencier une liste avec des conditions aux limites périodiques (le premier élément calcule la différence par rapport au dernier. Dans ce cas, la fonction numpy.roll est utile:
Solutions avec zéro ajouté
Une autre solution numpy (juste pour l'exhaustivité) consiste à utiliser
Cela fonctionne comme numpy.diff, mais uniquement sur un vecteur (cela aplatit le tableau d'entrée). Il offre la possibilité d'ajouter ou d'ajouter des nombres au vecteur résultant. Ceci est utile lors de la gestion des champs accumulés qui sont souvent les flux de cas dans les variables météorologiques (par exemple la pluie, la chaleur latente, etc.), car vous voulez une liste résultante de la même longueur que la variable d'entrée, avec la première entrée intacte.
Alors tu écrirais
Bien sûr, vous pouvez également le faire avec la commande np.diff, dans ce cas, vous devez ajouter zéro à la série avec le mot clé prepend:
Toutes les solutions ci-dessus renvoient un vecteur de même longueur que l'entrée.
la source
Mon chemin
la source
enumerate
est un gaspillage parce que vous n'utilisez pasvalue
. Voir stackoverflow.com/a/16714453/832230