Periksa apakah dua daftar sama, elemen mana yang cocok, dapatkan perbedaan antara dua daftar, bandingkan daftar kamus, daftar string, dan lainnya Show
·12 Des 2021·17 mnt dibaca Mainkan artikel ini Browser Anda tidak mendukung elemen audio. KECEPATAN1X Beberapa waktu yang lalu saya menulis panduan tentang cara membandingkan dua kamus di Python 3, dan bagaimana tugas ini tidak sesederhana kedengarannya. Ternyata membandingkan dua daftar dengan Python sama sulitnya dengan membandingkan 3sCara kami diajarkan untuk membandingkan dua objek dengan Python agak menyesatkan. Sebagian besar buku dan tutorial mengajarkan perbandingan objek dengan menggunakan operator 4 atau 5. Pada kenyataannya, kedua operator ini hanya mencakup sebagian kecil dari kasus penggunaan yang paling seringSebagai contoh
Daftarnya terus bertambah, dan untuk semua kasus penggunaan ini menggunakan 4 tidak membantuItulah yang akan kita lihat di artikel ini. Kami akan mempelajari cara terbaik untuk membandingkan dua daftar dengan Python untuk beberapa kasus penggunaan di mana operator 4 tidak cukupSiap? Membandingkan jika dua daftar sama dengan pythonCara termudah untuk membandingkan dua daftar untuk kesetaraan adalah dengan menggunakan operator 4. Metode perbandingan ini bekerja dengan baik untuk kasus-kasus sederhana, tetapi seperti yang akan kita lihat nanti, ini tidak bekerja dengan perbandingan tingkat lanjutContoh kasus sederhana adalah daftar objek 0 atau 1 _Cukup sederhana, bukan? . Di dunia nyata, segalanya menjadi rumit dengan sangat cepat. Sebagai ilustrasi, perhatikan kasus berikut Misalkan Anda memiliki daftar floating point yang dibangun secara dinamis. Anda dapat menambahkan elemen tunggal, atau elemen yang berasal dari operasi matematika seperti 2
Jelas, aritmatika floating point memiliki keterbatasan, dan terkadang kami ingin membandingkan dua daftar tetapi mengabaikan kesalahan presisi, atau bahkan menentukan beberapa toleransi. Untuk kasus seperti ini, operator _4 tidak akan cukupSegalanya bisa menjadi lebih rumit jika daftar memiliki objek khusus atau objek dari perpustakaan lain, seperti 6
Anda mungkin juga ingin membandingkan daftar dan mengembalikan kecocokannya. Atau mungkin bandingkan kedua daftar tersebut dan kembalikan perbedaannya. Atau mungkin Anda ingin membandingkan dua daftar dengan mengabaikan duplikatnya, atau membandingkan daftar kamus dengan Python Dalam setiap kasus, menggunakan _4 bukanlah jawabannya, dan itulah yang akan kita lihat selanjutnya. cara melakukan operasi perbandingan yang rumit antara dua daftar dengan PythonMembandingkan dua daftar angka floatPada bagian sebelumnya, kita melihat bahwa aritmatika floating point dapat menyebabkan kesalahan presisi. Jika kami memiliki daftar pelampung dan ingin membandingkannya dengan daftar lain, kemungkinan operator 4 tidak akan membantuMari tinjau kembali contoh dari bagian sebelumnya dan lihat apa cara terbaik untuk membandingkan dua daftar pelampung
Seperti yang Anda lihat, _7, yang menyebabkan perbandingan gagal. Sekarang, bagaimana kita bisa berbuat lebih baik? Ada beberapa cara untuk mendekati tugas ini. Salah satunya adalah membuat fungsi kustom kita sendiri, yang mengulang elemen dan membandingkannya satu per satu menggunakan fungsi Untungnya kita tidak perlu menemukan kembali kemudi. Seperti yang saya tunjukkan di artikel "bagaimana membandingkan dua dikte", kita dapat menggunakan perpustakaan bernama 9 untuk itu. Pustaka ini mendukung berbagai jenis objek dan daftar adalah salah satunyaContoh di bawah dimulai dengan menyiapkan dua daftar yang ingin kita bandingkan. Kami kemudian meneruskannya ke konstruktor _0 yang mengembalikan selisihnya. Itu bagus, nilai yang dikembalikan jauh lebih informatif daripada boolean sederhanaKarena kami ingin mengabaikan kesalahan presisi, kami dapat mengatur jumlah digit SETELAH koma desimal yang akan digunakan dalam perbandingan Hasilnya adalah dict kosong, artinya daftarnya sama. Jika kami mencoba membandingkan daftar dengan angka float yang berbeda lebih dari 3 digit signifikan, perpustakaan akan mengembalikan perbedaan itu Untuk reproduksibilitas, dalam artikel ini saya menggunakan versi terbaru dari 9 yaitu 2
Membandingkan jika dua daftar tanpa urutan (unordered list) adalah samaDaftar di Python tidak diurutkan secara default. Terkadang kami ingin membandingkan dua daftar tetapi memperlakukannya sama selama mereka memiliki elemen yang sama—terlepas dari urutannya Ada dua cara untuk melakukan hal ini
Dua metode pertama ini menganggap elemen dapat dibandingkan dengan aman menggunakan operator 4. Pendekatan ini tidak bekerja untuk bilangan titik-mengambang, dan objek kompleks lainnya, tetapi seperti yang kita lihat di bagian sebelumnya, kita dapat menggunakan 9Menyortir daftar dan menggunakan operator In [1]: import numpy as np In [2]: numbers = [np.ones(3), np.zeros(2)] In [3]: numbers Out[3]: [array([1., 1., 1.]), array([0., 0.])] In [4]: target = [np.ones(3), np.zeros(2)] In [5]: numbers == target --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-5-b832db4b039d> in <module> ----> 1 numbers == target ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 4Anda dapat mengurutkan daftar dengan Python dengan dua cara berbeda
Metode pertama mengurutkan daftar, dan itu berarti daftar Anda akan dimodifikasi. Merupakan ide bagus untuk tidak mengubah daftar karena dapat menimbulkan bug yang sulit dideteksi Menggunakan _2 lebih baik karena mengembalikan daftar baru dan menyimpan yang asli tidak dimodifikasiMari kita lihat cara kerjanya
Akibatnya, dengan mengurutkan daftar terlebih dahulu, kami memastikan bahwa kedua daftar akan memiliki urutan yang sama, sehingga dapat dibandingkan menggunakan operator 4Mengubah In [6]: numbers = [10, 30, 20] In [7]: target = [10, 20, 30] In [8]: numbers == target Out[8]: False In [9]: sorted(numbers) == sorted(target) Out[9]: True In [10]: sorted(numbers) Out[10]: [10, 20, 30] In [11]: sorted(target) Out[11]: [10, 20, 30] _4 menjadi In [1]: from deepdiff import DeepDiff In [2]: numbers = [] In [3]: numbers.append(0.1 + 0.1 + 0.1) # derive the element based on a summation In [4]: numbers.append(0.2) # add a single element In [5]: target = [0.3, 0.2] # if we don't specify the number of significant digits, the comparison will use == In [6]: DeepDiff(numbers, target) Out[6]: {'values_changed': {'root[0]': {'new_value': 0.3, 'old_value': 0.30000000000000004}}} # 0.30000000000000004 and 0.3 are equal if we only look at the first 3 significant digits In [7]: DeepDiff(numbers, target, significant_digits=3) Out[7]: {} In [8]: numbers Out[8]: [0.30000000000000004, 0.2] In [9]: target = [0.341, 0.2] # 0.341 differs in more than 3 significant digits In [10]: DeepDiff(numbers, target, significant_digits=3) Out[10]: {'values_changed': {'root[0]': {'new_value': 0.341, 'old_value': 0.30000000000000004}}} 4Berlawanan dengan daftar, set di Python tidak peduli dengan urutan. Misalnya, himpunan _6 sama dengan 7. Dengan demikian, kita dapat menggunakan fitur ini untuk membandingkan dua daftar dengan mengabaikan urutan elemenUntuk melakukannya, kami mengonversi setiap daftar menjadi satu set, lalu menggunakan 4 untuk membandingkannya
Menggunakan perpustakaan >>> numbers = [] >>> numbers.append(0.1 + 0.1 + 0.1) # derive the element based on a summation >>> numbers.append(0.2) # add a single element >>> target = [0.3, 0.2] >>> numbers == target # compares the lists False >>> numbers # Ooopppssss.... [0.30000000000000004, 0.2] >>> target [0.3, 0.2] _9Pustaka ini juga memungkinkan kita untuk mengabaikan urutan dalam urutan seperti 4s. Secara default, ini akan mempertimbangkan urutan, tetapi jika kita menetapkan 1 ke 2, maka kita semua baik-baik saja. Mari kita lihat ini beraksi
Menggunakan _9 memiliki pro dan kontra. Pada akhirnya, ini adalah perpustakaan eksternal yang perlu Anda instal, jadi jika Anda dapat menggunakan 4 untuk membandingkan daftar, maka pertahankan. Namun, jika Anda memiliki kasus penggunaan lain yang dapat membuatnya bersinar, maka saya akan menggunakannyaBagaimana membandingkan dua daftar dan mengembalikan kecocokanDi bagian ini, kita akan melihat bagaimana kita dapat membandingkan dua daftar dan menemukan persimpangannya. Dengan kata lain, kami ingin menemukan nilai yang muncul di keduanya Untuk melakukan itu, kita dapat sekali lagi menggunakan 4 dan mengambilnya
Bagaimana membandingkan dua daftar dengan python dan mengembalikan perbedaanKami dapat menemukan perbedaan antara dua daftar di python dengan dua cara berbeda
Menggunakan In [1]: from deepdiff import DeepDiff In [2]: numbers = [] In [3]: numbers.append(0.1 + 0.1 + 0.1) # derive the element based on a summation In [4]: numbers.append(0.2) # add a single element In [5]: target = [0.3, 0.2] # if we don't specify the number of significant digits, the comparison will use == In [6]: DeepDiff(numbers, target) Out[6]: {'values_changed': {'root[0]': {'new_value': 0.3, 'old_value': 0.30000000000000004}}} # 0.30000000000000004 and 0.3 are equal if we only look at the first 3 significant digits In [7]: DeepDiff(numbers, target, significant_digits=3) Out[7]: {} In [8]: numbers Out[8]: [0.30000000000000004, 0.2] In [9]: target = [0.341, 0.2] # 0.341 differs in more than 3 significant digits In [10]: DeepDiff(numbers, target, significant_digits=3) Out[10]: {'values_changed': {'root[0]': {'new_value': 0.341, 'old_value': 0.30000000000000004}}} _4Sama seperti yang kita lakukan untuk menentukan persimpangan, kita dapat memanfaatkan 4 struktur data untuk memeriksa perbedaan antara dua daftar di pythonJika kita ingin mendapatkan semua elemen yang ada di daftar pertama tetapi tidak di daftar kedua, kita dapat menggunakan 0Sebaliknya, jika kita ingin menemukan semua elemen yang ada di salah satu daftar tetapi tidak keduanya, maka kita dapat menggunakan 1
Metode ini memiliki keterbatasan. itu mengelompokkan apa yang berbeda antara daftar menjadi satu hasil akhir yang merupakan perbedaan yang ditetapkan. Bagaimana jika kita ingin mengetahui elemen mana di diff itu yang termasuk dalam daftar apa? Menggunakan >>> numbers = [] >>> numbers.append(0.1 + 0.1 + 0.1) # derive the element based on a summation >>> numbers.append(0.2) # add a single element >>> target = [0.3, 0.2] >>> numbers == target # compares the lists False >>> numbers # Ooopppssss.... [0.30000000000000004, 0.2] >>> target [0.3, 0.2] _9Seperti yang telah kita lihat sejauh ini, perpustakaan ini kuat dan mengembalikan diff yang bagus. Mari kita lihat apa yang terjadi ketika kita menggunakan _9 untuk mendapatkan perbedaan antara dua daftar di Python 0Dengan demikian, _9 mengembalikan apa yang berubah dari satu daftar ke daftar lainnya. Pendekatan yang tepat kemudian akan bergantung pada kasus penggunaan Anda. Jika Anda menginginkan diff yang mendetail, gunakan 5. Jika tidak, gunakan saja 4Bagaimana membandingkan dua daftar stringMembandingkan dua daftar string dengan Python sangat bergantung pada jenis perbandingan apa yang ingin Anda buat. Itu karena kita bisa membandingkan sebuah string dengan beberapa cara Di bagian ini, kita akan melihat 3 cara berbeda untuk melakukannya Yang paling sederhana adalah menggunakan operator _4, seperti yang kita lihat di awal. Metode ini cocok jika Anda menginginkan perbandingan yang ketat antara setiap string 1Hal-hal mulai menjadi berantakan jika Anda ingin membandingkan daftar string tetapi mengabaikan kasusnya. Menggunakan _4 untuk itu tidak akan berhasil 2Alat terbaik untuk itu lagi 9. Itu memungkinkan kita untuk mengabaikan string dengan mengirimkan bendera boolean ke string tersebut 3Kita juga dapat mengabaikan urutan kemunculan string dalam daftar 4Anda juga dapat melangkah lebih jauh dan melakukan perbandingan lanjutan dengan meneruskan operator khusus ke 5Misalnya, Anda ingin membandingkan string tetapi mungkin ada Atau mungkin Anda ingin melakukan metrik jarak edit Untuk melakukannya, kita dapat menulis logika perbandingan di kelas operator dan meneruskannya ke 5Dalam contoh pertama ini, kami akan mengabaikan spasi apa pun dengan memangkas string sebelum membandingkannya 5Kemudian kita cukup menyambungkan ke _5 dengan menambahkannya ke daftar 3, seperti 4 6Cara membandingkan dua daftar kamusMembandingkan dua daftar kamus dengan Python pasti rumit tanpa bantuan perpustakaan eksternal. Seperti yang telah kita lihat sejauh ini, _9 cukup serbaguna dan kita dapat menggunakannya untuk membandingkan objek yang sangat kompleks seperti daftar kamusMari kita lihat apa yang terjadi jika kita melewati dua daftar kamus 7Ini menampilkan lokasi yang tepat di mana elemen berbeda dan apa perbedaannya Mari kita lihat contoh lain di mana daftar memiliki elemen yang hilang _8Dikatakan kamus kedua telah dihapus, yang merupakan kasus untuk contoh ini Bagaimana membandingkan dua daftar daftarMembandingkan daftar multidimensi—a. k. daftar daftar—mudah untuk ________7______9. Ini berfungsi seperti daftar 3sPada contoh di bawah ini, kami memiliki dua daftar multidimensi yang ingin kami bandingkan. Saat diteruskan ke _5, ini mengembalikan lokasi yang tepat di mana elemen berbedaMisalnya, untuk posisi _9, nilai barunya adalah 8, dan yang lama adalah 3. Aspek lain yang menarik adalah ia bekerja untuk struktur bersarang dalam, misalnya, 9 juga menyoroti perbedaan dalam posisi 1 _9Saat memberi makan perpustakaan dengan dua daftar multidimensi yang identik, ini mengembalikan respons kosong 0Bagaimana membandingkan dua daftar objekTerkadang kami memiliki daftar objek khusus yang ingin kami bandingkan. Mungkin kami ingin mendapatkan diff, atau hanya memeriksa apakah mengandung elemen yang sama. Solusi untuk masalah ini tidak bisa berbeda. gunakan _9Contoh berikut menunjukkan kekuatan perpustakaan ini. Kami akan membandingkan dua daftar yang berisi objek khusus, dan kami akan dapat menyatakan apakah keduanya sama atau tidak dan apa perbedaannya Dalam contoh di bawah ini, kami memiliki dua daftar 3 objek. Satu-satunya perbedaan antara keduanya adalah bahwa pada posisi terakhir 3 objek memiliki usia yang berbeda. 9 tidak hanya menemukan posisi yang tepat - 6 - tetapi juga menemukan bahwa bidang 7 juga berbeda _1Bagaimana membandingkan dua daftar array numpyPada bagian ini, kita akan melihat bagaimana membandingkan dua daftar array 6. Ini adalah tugas yang cukup umum bagi mereka yang bekerja dengan ilmu data dan/atau pembelajaran mesinKita melihat di bagian pertama bahwa menggunakan operator 4 tidak bekerja dengan baik dengan daftar 6array. Untung bisa kita gunakan. tebak apa. ? Contoh di bawah menunjukkan dua daftar dengan array 6 yang berbeda dan perpustakaan dapat mendeteksi posisi yang tepat di mana mereka berbeda. Betapa kerennya itu? _2KesimpulanDalam posting ini, kami melihat banyak cara untuk membandingkan dua daftar dengan Python. Metode terbaik bergantung pada jenis elemen yang kita miliki dan bagaimana kita ingin membandingkannya. Mudah-mudahan, Anda sekarang tahu caranya Bisakah Anda membandingkan daftar dengan == di Python?Operator == membandingkan daftar, item demi item (perbandingan berdasarkan elemen) . Urutan item daftar asli tidak penting, karena daftar diurutkan sebelum perbandingan. Catatan. Anda hanya dapat mengurutkan daftar dengan item dari tipe data yang sama.
Bagaimana Anda membandingkan dua elemen daftar dengan bijaksana?Metode untuk membandingkan dua daftar diberikan di bawah ini. . Fungsi cmp() Fungsi set() dan operator == Fungsi sort() dan operator == Koleksi. fungsi penghitung() Fungsi reduce() dan map() Bagaimana Anda memeriksa apakah item dalam daftar sama dengan Python?Menggunakan Hitung()
. Jadi jika kita memiliki elemen yang sama berulang dalam daftar maka panjang daftar menggunakan len() akan sama dengan berapa kali elemen tersebut ada dalam daftar menggunakan count(). |