Dengan Python, apa cara terbaik untuk menghitung perbedaan antara dua daftar?
contoh
A = [1,2,3,4]
B = [2,5]
A - B = [1,3,4]
B - A = [5]
Gunakan set
jika Anda tidak peduli tentang pesanan barang atau pengulangan. Gunakan pemahaman daftar jika Anda melakukannya:
>>> def diff(first, second):
second = set(second)
return [item for item in first if item not in second]
>>> diff(A, B)
[1, 3, 4]
>>> diff(B, A)
[5]
>>>
set(b)
untuk menggunakan untuk memastikan algoritmenya adalah O (nlogn) dan bukan Theta (n ^ 2)set
ke B tidak berbahaya, tetapi menerapkannya keA
dan menggunakan hasilnya bukan yang asliA
tidak.Jika pesanan tidak menjadi masalah, Anda cukup menghitung perbedaan yang ditetapkan:
sumber
Anda bisa melakukan
dan
sumber
Satu liner:
Atau:
sumber
Contoh-contoh di atas meremehkan masalah penghitungan perbedaan. Dengan asumsi penyortiran atau de-duplikasi pasti membuatnya lebih mudah untuk menghitung perbedaan, tetapi jika perbandingan Anda tidak mampu asumsi itu maka Anda akan memerlukan implementasi algoritma diff yang tidak sepele. Lihat difflib di pustaka standar python.
A - B = [[1, 3, 4]]
sumber
print
telah berubah dari perintah ke fungsi, danreduce
,filter
danmap
telah dinyatakan unpythonic. (Dan saya pikir Guido mungkin benar - saya juga tidak mengerti apa yangreduce
dilakukan.)Python 2.7.3 (default, 27 Feb 2014, 19:58:35) - IPython 1.1.0 - timeit: (github gist )
Hasil:
@ roman-bodnarchuk daftar fungsi dif def def (a, b) tampaknya lebih cepat.
sumber
sumber
Anda ingin menggunakan
set
bukanlist
.sumber
Jika Anda ingin perbedaannya secara mendalam masuk ke item daftar Anda, saya telah menulis paket untuk python: https://github.com/erasmose/deepdiff
Instalasi
Instal dari PyPi:
Jika Anda Python3, Anda juga harus menginstal:
Contoh penggunaan
Objek yang sama kembali kosong
Jenis item telah berubah
Nilai suatu barang telah berubah
Item ditambahkan dan / atau dihapus
Perbedaan string
Perbedaan string 2
Ketik perubahan
Daftar perbedaan
Daftar perbedaan 2: Perhatikan bahwa JANGAN memperhitungkan pesanan
Daftar yang berisi kamus:
sumber
cara paling sederhana,
gunakan set (). perbedaan (set ())
jawabannya adalah
set([1])
sumber
Dalam kasus daftar kamus , solusi pemahaman daftar lengkap berfungsi saat
set
solusi meningkatKasus cobaan
sumber
Kode sederhana yang memberi Anda perbedaan dengan banyak item jika Anda menginginkannya:
sumber
Ketika melihat TimeComplexity of In-operator, dalam kasus terburuk berfungsi dengan O (n). Bahkan untuk Set.
Jadi ketika membandingkan dua array kita akan memiliki TimeComplexity dari O (n) dalam kasus terbaik dan O (n ^ 2) dalam kasus terburuk.
Solusi alternatif (tapi sayangnya lebih kompleks), yang bekerja dengan O (n) dalam kasus terbaik dan terburuk adalah yang ini:
misalnya
sumber