Saya memiliki dua kamus, tetapi untuk penyederhanaan, saya akan mengambil dua ini:
>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)
Sekarang, saya ingin membandingkan apakah masing-masing key, value
pasangan x
memiliki nilai yang sesuai di y
. Jadi saya menulis ini:
>>> for x_values, y_values in zip(x.iteritems(), y.iteritems()):
if x_values == y_values:
print 'Ok', x_values, y_values
else:
print 'Not', x_values, y_values
Dan itu berfungsi sejak a tuple
dikembalikan dan kemudian dibandingkan untuk kesetaraan.
Pertanyaan saya:
Apakah ini benar? Apakah ada cara yang lebih baik untuk melakukan ini? Lebih baik tidak dalam kecepatan, saya berbicara tentang keanggunan kode.
UPDATE: Saya lupa menyebutkan bahwa saya harus memeriksa berapa key, value
pasangan yang sama.
python
dictionary
comparison
pengguna225312
sumber
sumber
x == y
harus benar sesuai dengan stackoverflow.com/a/5635309/186202Jawaban:
Jika Anda ingin tahu berapa banyak nilai yang cocok dengan kedua kamus, Anda harus mengatakan itu :)
Mungkin kira-kira seperti ini:
sumber
list
kunci di tempat pertama.x = {[1,2]: 2}
akan gagal. Pertanyaannya sudah validdicts
.list
kunci bukan kode python yang valid - kunci dict harus tidak berubah. Karena itu Anda tidak membandingkan kamus. Jika Anda mencoba dan menggunakan daftar sebagai kunci kamus, kode Anda tidak akan berjalan. Anda tidak memiliki objek untuk dibandingkan. Ini seperti mengetikx = dict(23\;dfg&^*$^%$^$%^)
lalu mengeluh bagaimana perbandingan tidak berfungsi dengan kamus. Tentu saja itu tidak akan berhasil. Komentar Tim di sisi lain adalah tentang bisa berubahvalues
, maka mengapa saya mengatakan bahwa ini adalah masalah yang berbeda.set
membutuhkan nilai yang harus hashable dandict
membutuhkan kunci yang harus hashable.set(x.keys())
akan selalu berfungsi karena kunci diharuskan untuk hashable, tetapiset(x.values())
akan gagal pada nilai yang tidak hashable.Yang ingin Anda lakukan hanyalah sederhana
x==y
Apa yang Anda lakukan bukanlah ide yang baik, karena barang-barang dalam kamus tidak seharusnya dipesan. Anda mungkin membandingkan
[('a',1),('b',1)]
dengan[('b',1), ('a',1)]
(kamus yang sama, urutan berbeda).Sebagai contoh, lihat ini:
Perbedaannya hanya satu item, tetapi algoritma Anda akan melihat bahwa semua item berbeda
sumber
sumber
DataFrame
menurut desain tidak memungkinkan perbandingan yang benar (kecuali jika memiliki panjang 1) karena mereka mewarisi darinumpy.ndarray
. -credit to stackoverflow.com/a/33307396/994076dic1 == dic2
Dari python docs :
Berlaku untuk keduanya
py2
danpy3
.sumber
OrderedDict != dict
Saya baru mengenal python tapi akhirnya saya melakukan sesuatu yang mirip dengan @mouad
Operator XOR (
^
) harus menghilangkan semua elemen dict ketika keduanya sama di kedua dicts.sumber
{'a':{'b':1}}
memberikanTypeError: unhashable type: 'dict'
)Karena sepertinya tidak ada yang disebutkan
deepdiff
, saya akan menambahkannya di sini untuk kelengkapan. Saya merasa sangat nyaman untuk mendapatkan objek yang berbeda (bersarang) secara umum:Instalasi
Kode sampel
Keluaran
Catatan tentang pencetakan cantik hasil untuk pemeriksaan: Kode di atas berfungsi jika kedua dikte memiliki kunci atribut yang sama (dengan nilai atribut yang mungkin berbeda seperti pada contoh). Namun, jika suatu
"extra"
atribut hadir adalah salah satu dicts,json.dumps()
gagal denganSolusi: gunakan
diff.to_json()
danjson.loads()
/json.dumps()
untuk mencetak-cantik:Keluaran:
Alternatif: gunakan
pprint
, menghasilkan pemformatan yang berbeda:Keluaran:
sumber
Cukup gunakan:
sumber
dict1 == dict2
cmp
built-in telah dihapus (dan harus diperlakukan sebagai dihapus sebelumnya . Alternatif yang mereka usulkan:(a > b) - (a < b) == cmp(a, b)
untuk fungsional yang setara (atau lebih baik__eq__
dan__hash__
)TypeError
:unorderable types: dict() < dict()
Jawaban @mouad bagus jika Anda menganggap bahwa kedua kamus hanya berisi nilai-nilai sederhana. Namun, jika Anda memiliki kamus yang berisi kamus Anda akan mendapatkan pengecualian karena kamus tidak dapat diacak.
Di atas kepala saya, sesuatu seperti ini mungkin bekerja:
sumber
not isinstance(dict1, dict)
alih-alihtype(dict1) is not dict
, ini akan bekerja pada kelas lain berdasarkan padadict. Also, instead of
(dict1 [key] == dict2 [key]), you can do
semua (atleast_1d (dict1 [key] == dict2 [key])) `untuk menangani array setidaknya.for loop
segera setelah Andadicts_are_equal
menjadi salah. Tidak perlu melanjutkan lebih jauh.Namun kemungkinan lain, hingga catatan terakhir OP, adalah untuk membandingkan hash (
SHA
atauMD
) dari dikte yang dibuang sebagai JSON. Cara hash dibangun menjamin bahwa jika mereka sama, string sumbernya juga sama. Ini sangat cepat dan suara secara matematis.sumber
json.dumps(d, sort_keys=True)
akan memberi Anda JSON kanonik sehingga Anda dapat yakin bahwa kedua diktuanya setara. Itu juga tergantung apa yang ingin Anda capai. Segera setelah nilainya tidak dapat diservis JSON, ia akan gagal. Untuk itu yang mengatakan itu tidak efisien, lihatlah proyek ujson.Fungsinya IMO baik, jelas dan intuitif. Tapi hanya untuk memberi Anda (yang lain) jawaban, ini dia:
Dapat bermanfaat bagi Anda atau orang lain ..
EDIT:
Saya telah membuat versi rekursif dari yang di atas .. Belum melihat jawaban yang lain
sumber
Untuk menguji apakah dua dicts sama dalam kunci dan nilai:
Jika Anda ingin mengembalikan nilai yang berbeda, tulis secara berbeda:
Anda harus menyebutnya dua kali yaitu
sumber
Kode
Uji
sumber
Perbandingan sederhana dengan == sudah cukup saat ini (python 3.8). Bahkan ketika Anda membandingkan dict yang sama dalam urutan yang berbeda (contoh terakhir). Yang terbaik adalah, Anda tidak perlu paket pihak ketiga untuk mencapai ini.
sumber
Terlambat dalam respons saya lebih baik daripada tidak pernah!
Bandingkan Not_Equal lebih efisien daripada membandingkan Equal. Dengan demikian, dua dict tersebut tidak sama jika nilai kunci dalam satu dict tidak ditemukan di dict lainnya. Kode di bawah ini mempertimbangkan bahwa Anda mungkin membandingkan dict default dan karenanya menggunakan get bukannya getitem [].
Menggunakan semacam nilai acak sebagai default dalam panggilan panggil sama dengan kunci yang diambil - untuk jaga-jaga jika dicts memiliki nilai None sebagai dalam satu dict dan kunci tersebut tidak ada di yang lain. Juga kondisi get! = Diperiksa sebelum tidak dalam kondisi untuk efisiensi karena Anda melakukan pemeriksaan pada kunci dan nilai dari kedua sisi pada saat yang sama.
sumber
Saya menggunakan solusi ini yang bekerja sempurna untuk saya di Python 3
Ini membandingkan dict, daftar, dan jenis lainnya yang mengimplementasikan operator "==" sendiri. Jika Anda perlu membandingkan sesuatu yang berbeda, Anda perlu menambahkan cabang baru di "if tree".
Semoga itu bisa membantu.
sumber
untuk python3:
sumber
Ini pilihan lain:
Jadi seperti yang Anda lihat, kedua id berbeda. Tapi operator pembanding kaya sepertinya melakukan trik:
sumber
Di PyUnit ada metode yang membandingkan kamus dengan indah. Saya mengujinya menggunakan dua kamus berikut, dan ia melakukan apa yang Anda cari.
Saya tidak merekomendasikan mengimpor
unittest
ke kode produksi Anda. Pikiran saya adalah sumber di PyUnit dapat digunakan kembali untuk berjalan dalam produksi. Ini menggunakanpprint
"cetakan cantik" kamus. Tampaknya mudah untuk mengadaptasi kode ini menjadi "siap produksi".sumber
lihat objek tampilan kamus: https://docs.python.org/2/library/stdtypes.html#dict
Dengan cara ini Anda dapat mengurangi dictView2 dari dictView1 dan itu akan mengembalikan satu set pasangan kunci / nilai yang berbeda di dictView2:
Anda dapat memotong, menyatukan, perbedaan (ditampilkan di atas), perbedaan simetris objek tampilan kamus ini.
Lebih baik? Lebih cepat? - tidak yakin, tetapi bagian dari perpustakaan standar - yang membuatnya menjadi nilai tambah yang besar untuk portabilitas
sumber
Kode di bawah ini akan membantu Anda membandingkan daftar dict dengan python
sumber
sumber
Dalam Python 3.6, Ini dapat dilakukan sebagai: -
variabel ret akan benar jika semua item dict_1 hadir di dict_2
sumber
Inilah jawaban saya, gunakan cara rekursif:
Semoga itu bisa membantu!
sumber
Mengapa tidak hanya beralih melalui satu kamus dan memeriksa kamus lain dalam proses (dengan asumsi kedua kamus memiliki kunci yang sama)?
Keluaran:
sumber
Cara termudah (dan salah satu yang lebih kuat pada saat itu) untuk melakukan perbandingan yang mendalam dari dua kamus adalah dengan membuat serial mereka dalam format JSON, mengurutkan kunci, dan membandingkan hasil string:
sumber
sumber
json.dumps
yang ditentukan dengan pengaturan default).