Gegeben eine Liste von zahlen, wie findet man Unterschiede zwischen den einzelnen (i
)-TEN Elemente und Ihre (i+1
)-th?
Ist es besser, auf ein lambda
Ausdruck oder vielleicht eine list comprehension?
Beispiel:
Gegeben eine Liste t=[1,3,6,...]
, das Ziel ist es, eine Liste 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 Importitertools
undoperator
).list(map(operator.sub, t[1:], t[:-1]))
tun.Die anderen Antworten sind korrekt, aber wenn du tust numerische arbeiten, möchten Sie vielleicht zu prüfen, numpy. Mit numpy, die Antwort ist:
Wenn Sie nicht möchten, zu verwenden
numpy
nochzip
, können Sie die folgende Lösung:Können Sie
itertools.tee
undzip
effizient zu bauen, das Ergebnis:Oder mit
itertools.islice
statt:Können Sie auch vermeiden, mit den
itertools
Modul:Alle diese Lösung funktioniert in ständiger Platz, wenn Sie nicht brauchen, um zu speichern alle Ergebnisse und Unterstützung unendlich iterables.
Hier sind einige micro-benchmarks für die Lösungen:
Und die andere vorgeschlagene Lösungen:
Beachten Sie, dass:
zip(L[1:], L)
entsprichtzip(L[1:], L[:-1])
seitzip
bereits beendet, auf dem kürzesten input, aber es vermeidet eine vollständige KopieL
.numpy.diff
ist langsam, da Sie zuerst konvertieren Sie dielist
zu einemndarray
. Natürlich, wenn Sie start mit einerndarray
es wird viel schneller:islice(seq, 1, None)
stattislice(seq, 1, len(seq))
macht es das arbeiten mit unendlichen iterablesOk. Ich glaube, ich fand die richtige Lösung:
Einen funktionalen Ansatz:
Generator:
Unter Verwendung von Indizes:
Ich würde vorschlagen, mit
dies ist einfach und leicht zu Lesen.
Aber wenn Sie wollen
v
zu haben, die sich in derselben Zeile wiet
dannoder
FYI: dies funktioniert nur bei Listen.
für numpy-arrays
Mein Weg
enumerate
ist verschwenderisch, weil Sie nicht mitvalue
. Siehe stackoverflow.com/a/16714453/832230