Wie findet man bei einer Liste von Zahlen Unterschiede zwischen jedem ( i
) -ten Element und seinem ( i+1
) -ten?
Ist es besser, einen lambda
Ausdruck oder vielleicht ein Listenverständnis zu verwenden?
Beispielsweise:
In einer vorgegebenen Liste t=[1,3,6,...]
ist das Ziel , eine Liste zu finden , v=[2,3,...]
weil 3-1=2
, 6-3=3
usw.
[abs(j-i) for i,j in zip(t, t[1:])]
list(itertools.starmap(operator.sub, zip(t[1:], t)))
(nach dem Importierenitertools
undoperator
).list(map(operator.sub, t[1:], t[:-1]))
.Die anderen Antworten sind richtig, aber wenn Sie numerische Arbeiten ausführen, sollten Sie Numpy in Betracht ziehen. Mit numpy lautet die Antwort:
quelle
np.diff([2,4,9])
wäre[2,5]
zip
Version?Wenn Sie möchten , verwenden Sie nicht
numpy
nochzip
, können Sie die folgende Lösung verwenden:quelle
Sie können das Ergebnis verwenden
itertools.tee
undzip
effizient erstellen:Oder verwenden Sie
itertools.islice
stattdessen:Sie können die Verwendung des
itertools
Moduls auch vermeiden :Alle diese Lösungen funktionieren auf konstantem Raum, wenn Sie nicht alle Ergebnisse speichern und unendlich viele Iterables unterstützen müssen.
Hier sind einige Mikro-Benchmarks der Lösungen:
Und die anderen vorgeschlagenen Lösungen:
Beachten Sie, dass:
zip(L[1:], L)
ist gleichbedeutend mit,zip(L[1:], L[:-1])
dazip
bereits bei der kürzesten Eingabe beendet wird, jedoch wird eine ganze Kopie von vermiedenL
.numpy.diff
ist langsam, weil es zuerst daslist
in a konvertieren mussndarray
. Natürlich , wenn Sie beginnen mit einemndarray
wird es viel schneller:quelle
islice(seq, 1, None)
anstattislice(seq, 1, len(seq))
es mit unendlichen Iterablen arbeiten zu lassenVerwenden des
:=
in Python 3.8+ verfügbaren Walross-Operators:quelle
Ich würde vorschlagen, zu verwenden
Das ist einfach und leicht zu lesen.
Aber wenn Sie
v
die gleiche Länge wiet
damals haben wollenoder
Zu Ihrer Information: Dies funktioniert nur für Listen.
für numpy Arrays
quelle
Ein funktionaler Ansatz:
Generator verwenden:
Indizes verwenden:
quelle
OK. Ich denke, ich habe die richtige Lösung gefunden:
quelle
Lösung mit periodischen Grenzen
Manchmal möchten Sie bei der numerischen Integration eine Liste mit periodischen Randbedingungen differenzieren (daher berechnet das erste Element die Differenz zum letzten. In diesem Fall ist die Funktion numpy.roll hilfreich:
Lösungen ohne Null
Eine andere numpy Lösung (nur der Vollständigkeit halber ) ist zu verwenden
Dies funktioniert als numpy.diff, jedoch nur für einen Vektor (es glättet das Eingabearray). Es bietet die Möglichkeit, dem resultierenden Vektor Zahlen voranzustellen oder anzuhängen. Dies ist nützlich, wenn akkumulierte Felder behandelt werden, wie dies häufig bei meteorologischen Variablen (z. B. Regen, latente Wärme usw.) der Fall ist, da Sie eine resultierende Liste mit der gleichen Länge wie die Eingabevariable erhalten möchten, wobei der erste Eintrag unberührt bleibt.
Dann würdest du schreiben
Natürlich können Sie dies auch mit dem Befehl np.diff tun. In diesem Fall müssen Sie der Reihe jedoch Null mit dem Schlüsselwort prepend voranstellen:
Alle obigen Lösungen geben einen Vektor zurück, der dieselbe Länge wie die Eingabe hat.
quelle
Meine Art
quelle
enumerate
ist verschwenderisch, weil Sie nicht verwendenvalue
. Siehe stackoverflow.com/a/16714453/832230