Saya memiliki dua daftar dengan Python, seperti ini:
temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']
Saya perlu membuat daftar ketiga dengan item dari daftar pertama yang tidak ada di daftar kedua. Dari contoh saya harus mendapatkan:
temp3 = ['Three', 'Four']
Apakah ada cara cepat tanpa siklus dan pemeriksaan?
python
performance
list
set
set-difference
Max Frai
sumber
sumber
temp1 = ['One', 'One', 'One']
dantemp2 = ['One']
, apakah Anda ingin['One', 'One']
kembali, atau[]
?Jawaban:
Waspadalah itu
di mana Anda mungkin mengharapkan / menginginkannya sama
set([1, 3])
. Jika Anda inginset([1, 3])
sebagai jawaban, Anda harus menggunakannyaset([1, 2]).symmetric_difference(set([2, 3]))
.sumber
TypeError: 'str' object is not callable
ketika saya melakukan operasi inia = [1,2,2,2,3]
danb = [2]
Semua solusi yang ada menawarkan salah satu dari yang berikut:
Namun sejauh ini tidak ada solusi yang memiliki keduanya. Jika Anda ingin keduanya, coba ini:
Uji kinerja
Hasil:
Metode yang saya sajikan serta menjaga pesanan juga (sedikit) lebih cepat dari pengurangan yang ditetapkan karena tidak memerlukan konstruksi dari set yang tidak perlu. Perbedaan kinerja akan lebih terlihat jika daftar pertama jauh lebih lama daripada yang kedua dan jika hashing mahal. Inilah tes kedua yang menunjukkan ini:
Hasil:
sumber
sumber
temp2
menjadi himpunan sebelumnya akan membuat ini sedikit lebih efisien.item not in temp2
danitem not in set(temp2)
akan selalu mengembalikan hasil yang sama, terlepas dari apakah ada duplikat atau tidaktemp2
.Perbedaan antara dua daftar (katakanlah list1 dan list2) dapat ditemukan menggunakan fungsi sederhana berikut.
atau
Dengan Menggunakan fungsi di atas, perbedaan dapat ditemukan menggunakan
diff(temp2, temp1)
ataudiff(temp1, temp2)
. Keduanya akan memberikan hasilnya['Four', 'Three']
. Anda tidak perlu khawatir tentang urutan daftar atau daftar mana yang harus diberikan terlebih dahulu.Referensi dokumen Python
sumber
Jika Anda menginginkan perbedaan secara rekursif, saya telah menulis paket untuk python: https://github.com/seperman/deepdiff
Instalasi
Instal dari PyPi:
Contoh penggunaan
Pengimporan
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:
Daftar perbedaan mengabaikan urutan atau duplikat: (dengan kamus yang sama seperti di atas)
Daftar yang berisi kamus:
Set:
Dinamai Tuples:
Objek khusus:
Atribut objek ditambahkan:
sumber
Dapat dilakukan dengan menggunakan operator python XOR.
sumber
cara paling sederhana,
gunakan set (). perbedaan (set ())
jawabannya adalah
set([1])
dapat mencetak sebagai daftar,
sumber
Jika Anda benar-benar melihat ke kinerja, maka gunakan numpy!
Berikut ini adalah buku catatan lengkap sebagai inti pada github dengan perbandingan antara daftar, numpy, dan panda.
https://gist.github.com/denfromufa/2821ff59b02e9482be15d27f2bbd4451
sumber
saya akan melemparkan karena tidak ada solusi yang menghasilkan tuple:
kalau tidak:
Seperti jawaban non-tuple lainnya yang menghasilkan arah ini, ia menjaga ketertiban
sumber
Aku ingin sesuatu yang akan mengambil dua daftar dan bisa melakukan apa yang
diff
dibash
lakukan. Karena pertanyaan ini muncul pertama kali ketika Anda mencari "python diff two list" dan tidak terlalu spesifik, saya akan memposting apa yang saya dapatkan.Menggunakan
SequenceMather
daridifflib
Anda dapat membandingkan dua daftar sepertidiff
halnya. Tidak ada jawaban lain yang akan memberi tahu Anda posisi di mana perbedaan itu terjadi, tetapi jawaban ini tidak. Beberapa jawaban memberikan perbedaan hanya dalam satu arah. Beberapa menyusun ulang elemen. Beberapa tidak menangani duplikat. Tetapi solusi ini memberi Anda perbedaan nyata antara dua daftar:Output ini:
Tentu saja, jika aplikasi Anda membuat asumsi yang sama dengan jawaban lainnya, Anda akan mendapat manfaat paling banyak dari mereka. Tetapi jika Anda mencari yang benar
diff
fungsionalitas yang , maka ini adalah satu-satunya cara untuk pergi.Misalnya, tidak ada jawaban lain yang dapat menangani:
Tapi yang ini:
sumber
Coba ini:
sumber
ini bisa lebih cepat daripada pemahaman daftar Markus:
sumber
from itertools import filterfalse
sedikit di sini. Perhatikan juga bahwa ini tidak mengembalikan urutan seperti yang lain, itu mengembalikan iterator.Inilah
Counter
jawaban untuk kasus paling sederhana.Ini lebih pendek daripada yang di atas yang melakukan dua arah diffs karena hanya melakukan persis apa yang ditanyakan: menghasilkan daftar apa yang ada di daftar pertama tetapi bukan yang kedua.
Atau, tergantung pada preferensi keterbacaan Anda, itu membuat satu baris yang layak:
Keluaran:
Perhatikan bahwa Anda dapat menghapus
list(...)
panggilan jika Anda hanya mengulanginya.Karena solusi ini menggunakan penghitung, ia menangani jumlah dengan benar vs banyak jawaban berbasis set. Misalnya pada input ini:
Outputnya adalah:
sumber
Anda bisa menggunakan metode naif jika elemen-elemen dari diflist diurutkan dan ditetapkan.
atau dengan metode kumpulan asli:
Solusi naif: 0,0787101593292
Solusi set asli: 0.998837615564
sumber
Saya sedikit terlambat dalam permainan untuk ini, tetapi Anda dapat melakukan perbandingan kinerja beberapa kode yang disebutkan di atas dengan ini, dua pesaing tercepat adalah,
Saya minta maaf untuk pengkodean tingkat dasar.
sumber
Berikut adalah beberapa cara sederhana, mempertahankan urutan untuk membedakan dua daftar string.
Kode
Pendekatan yang tidak biasa menggunakan
pathlib
:Ini mengasumsikan kedua daftar berisi string dengan permulaan yang setara. Lihat dokumen untuk detail lebih lanjut. Catatan, ini tidak terlalu cepat dibandingkan dengan operasi yang ditetapkan.
Implementasi langsung menggunakan
itertools.zip_longest
:sumber
temp1
dantemp2
berbaris dengan baik. Jika Anda, misalnya, membalikkan elementemp2
atau memasukkan nilai lain di awaltemp2
, listcomp hanya akan mengembalikan elemen yang sama seperti ditemp1
Ini adalah solusi lain:
sumber
Jika Anda bertemu
TypeError: unhashable type: 'list'
Anda perlu mengubah daftar atau set menjadi tupel, misLihat juga Bagaimana membandingkan daftar daftar / set dengan python?
sumber
Katakanlah kita memiliki dua daftar
kita dapat melihat dari dua daftar di atas bahwa item 1, 3, 5 ada di list2 dan item 7, 9 tidak. Di sisi lain, item 1, 3, 5 ada di list1 dan item 2, 4 tidak.
Apa solusi terbaik untuk mengembalikan daftar baru yang berisi item 7, 9 dan 2, 4?
Semua jawaban di atas menemukan solusinya, sekarang apa yang paling optimal?
melawan
Menggunakan timeit kita bisa melihat hasilnya
kembali
sumber
versi baris tunggal dari solusi arulmr
sumber
jika Anda menginginkan sesuatu yang lebih seperti setelan perubahan ... bisa menggunakan Penghitung
sumber
Kami dapat menghitung persimpangan minus gabungan daftar:
sumber
Ini dapat diselesaikan dengan satu baris. Pertanyaan diberikan dua daftar (temp1 dan temp2) mengembalikan perbedaannya dalam daftar ketiga (temp3).
sumber
Berikut adalah cara sederhana untuk membedakan dua daftar (apa pun isinya), Anda bisa mendapatkan hasilnya seperti yang ditunjukkan di bawah ini:
Semoga ini bisa membantu.
sumber
Saya lebih suka menggunakan konversi ke set dan kemudian menggunakan fungsi "perbedaan ()". Kode lengkapnya adalah:
Keluaran:
Ini paling mudah untuk dipahami, dan lebih baik lagi jika Anda bekerja dengan data besar, mengonversinya ke set akan menghapus duplikat jika duplikat tidak diperlukan. Semoga bisa membantu ;-)
sumber
sumber
mis. jika
list1 = [10, 15, 20, 25, 30, 35, 40]
danlist2 = [25, 40, 35]
kemudian daftar yang dikembalikan adalahoutput = [10, 20, 30, 15]
sumber