Diberikan daftar angka, bagaimana cara menemukan perbedaan antara setiap i
elemen ( ) -th dan ( i+1
) -th?
Apakah lebih baik menggunakan lambda
ekspresi atau mungkin pemahaman daftar?
Sebagai contoh:
Mengingat daftar t=[1,3,6,...]
, tujuannya adalah untuk menemukan daftar v=[2,3,...]
karena 3-1=2
, 6-3=3
, dll
[abs(j-i) for i,j in zip(t, t[1:])]
list(itertools.starmap(operator.sub, zip(t[1:], t)))
(setelah mengimporitertools
danoperator
).list(map(operator.sub, t[1:], t[:-1]))
.Jawaban lain benar tetapi jika Anda melakukan pekerjaan numerik, Anda mungkin ingin mempertimbangkan numpy. Menggunakan numpy, jawabannya adalah:
sumber
np.diff([2,4,9])
akan[2,5]
zip
versinya?Jika Anda tidak ingin menggunakan
numpy
atauzip
, Anda dapat menggunakan solusi berikut:sumber
Anda dapat menggunakan
itertools.tee
danzip
membuat hasilnya secara efisien:Atau gunakan
itertools.islice
sebagai gantinya:Anda juga dapat menghindari penggunaan
itertools
modul:Semua solusi ini bekerja dalam ruang konstan jika Anda tidak perlu menyimpan semua hasil dan mendukung iterable tak terbatas.
Berikut beberapa tolok ukur mikro dari solusi tersebut:
Dan solusi lain yang diusulkan:
Perhatikan bahwa:
zip(L[1:], L)
setara denganzip(L[1:], L[:-1])
karenazip
sudah berakhir pada input terpendek, namun ia menghindari seluruh salinanL
.numpy.diff
adalah lambat karena harus pertama mengkonversilist
kendarray
. Jelas jika Anda mulai denganndarray
itu akan jauh lebih cepat:sumber
islice(seq, 1, None)
alih-alihislice(seq, 1, len(seq))
membuatnya berfungsi dengan iterabel tak terbatasMenggunakan
:=
operator walrus yang tersedia di Python 3.8+:sumber
Saya akan menyarankan menggunakan
ini sederhana dan mudah dibaca.
Tetapi jika Anda ingin
v
memiliki panjang yang sama sepertit
ituatau
FYI: ini hanya akan berfungsi untuk daftar.
untuk array numpy
sumber
Pendekatan fungsional:
Menggunakan generator:
Menggunakan indeks:
sumber
Baik. Saya rasa saya menemukan solusi yang tepat:
sumber
Solusi dengan batasan berkala
Terkadang dengan integrasi numerik Anda ingin membedakan daftar dengan kondisi batas periodik (sehingga elemen pertama menghitung perbedaan dengan yang terakhir. Dalam hal ini fungsi numpy.roll berguna:
Solusi dengan nol di awal
Lain numpy solusi (hanya untuk kelengkapan) adalah untuk digunakan
Ini berfungsi sebagai numpy.diff, tetapi hanya pada vektor (itu meratakan larik input). Ini menawarkan kemampuan untuk menambahkan atau menambahkan angka ke vektor yang dihasilkan. Ini berguna saat menangani bidang terakumulasi yang sering terjadi fluks dalam variabel meteorologi (misalnya hujan, panas laten, dll.), Karena Anda menginginkan daftar yang dihasilkan dengan panjang yang sama dengan variabel masukan, dengan entri pertama tidak tersentuh.
Kemudian Anda akan menulis
Tentu saja, Anda juga dapat melakukan ini dengan perintah np.diff, dalam hal ini meskipun Anda perlu menambahkan nol ke seri dengan kata kunci awal:
Semua solusi di atas mengembalikan vektor dengan panjang yang sama dengan input.
sumber
Jalanku
sumber
enumerate
itu boros karena Anda tidak menggunakannyavalue
. Lihat stackoverflow.com/a/16714453/832230