Python membandingkan dua kunci dan nilai kamus

Sama dengan (==) operator membandingkan dua kamus dan mengembalikan True jika keduanya kamus sama, False jika tidak

# Python program to compare two dictionaries 
# using == operator

record1 = {'id': 101, 'name': 'Shivang Yadav', 'Age': 21} 
record2 = {'id': 101, 'name': 'Shivang Yadav', 'Age': 21} 
record3 = {'id': 102, 'name': 'Radib Kar', 'Age': 23} 

if record1 == record2: 
	print("record1 is equal to record2")
else: 
	print("record1 is not equal to record2")

if record2 == record3: 
	print("record2 is equal to record3")
else: 
	print("record2 is not equal to record3")

Keluaran

record1 is equal to record2
record2 is not equal to record3
_

2) Bandingkan dua kamus menggunakan metode DeepDiff()

Metode DeepDiff() berasal dari modul "deepdiff" dan membandingkan perbedaan antara dua kamus (koleksi lain juga), dan mengembalikan nilai yang diubah

Saya pikir Anda salah memahami

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
_1.
# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
1 dirancang untuk bekerja untuk objek apa pun, bahkan jika mereka tidak mendukung == operator. Dengan kata lain, NotImplemented menjadi False

>>> "0" == 0
False
_

Jadi,

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
_3 menjadi Salah sesuai dengan harapan Anda “Atau Tidak Diimplementasikan”

Python membandingkan dua kunci dan nilai kamus
PeterL

Saya tidak mengerti mengapa tidak ada semantik yang masuk akal?

Mari kita lihat semantik di Python 2

  • dict==dict din't care order (ditto di Python 3)
  • Python 2 dict tidak menjamin pesanan. (Python 3 menyimpan urutan penyisipan)
  • kunci(), nilai(), item() memiliki urutan yang konsisten (ditto di Python 3)
d1 = {'a': 1, 'b': 2}
d2 = {'b': 2, 'a': 1}
print(d1.values() == d2.values())  # What returned here?
_

Apa yang Anda harapkan di sini?
Saya percaya tidak ada yang berpikir "Benar dalam 1/len(d) kemungkinan, salah jika tidak" semantik itu bagus

Ada beberapa kemungkinan semantik

  • Bandingkan sebagai urutan
  • Bandingkan sebagai set
  • Bandingkan sebagai multiset

Saya tidak berpikir tidak satu pun di atas adalah semantik default yang baik

Saya pikir dokumentasinya menyesatkan sampai-sampai salah

dikt. kesetaraan nilai akhirnya jatuh kembali pada semantik default untuk kesetaraan, yang menguji identitas

>>> d = {'key': 1}
>>> x = d.values()
>>> x == x
True

Alasan d. nilai(). = d. values() bukan karena objek values ​​selalu membandingkan tidak sama, tetapi karena setiap kali Anda memanggil metode, ia mengembalikan objek baru (berbeda)

Mengenai Masalah 12445. objek nilai tampilan dict hilang tp_richcmp dan tp_as_number - Pelacak Python, saya menyangkal bahwa tidak ada semantik yang berarti untuk objek nilai. Mereka jelas merupakan sekumpulan objek acak yang tidak terurut, bukan kumpulan atau urutan, hanya kumpulan. Kita dapat secara bermakna mendefinisikan kesetaraan dengan dua cara

  • dua objek bernilai sama jika mengandung elemen yang sama, jumlah waktu yang sama, dalam urutan apa pun;

  • atau dua nilai objek sama jika keduanya dilihat dari dict yang sama

Tes kedua hampir sama murahnya dengan tes identitas pada objek nilai itu sendiri. Dari pada

return self is other
_

kami mengembalikan

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
_4 (kecuali bahwa dict yang memiliki objek nilai tidak diekspos ke kode Python, jadi saya kira tes ini hanya dapat ditulis dalam C)

Tes pertama lebih mahal. Saya tidak bisa memikirkan bagaimana melakukan tes secara efisien. Jika hashable, kita bisa menggunakan Counter() tetapi tidak selalu hashable

Python membandingkan dua kunci dan nilai kamus
PeterL

Poin bagus. Saya memiliki dua dict data - kuncinya sama - apakah ada nilai yang berubah?
Masalah yang saya lihat dengan pengembalian nilai yang sama

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5 adalah bahwa ini menyiratkan bahwa mereka (nilainya) berbeda
Meskipun, saya akui, dalam hal ini, perbandingan langsung dari dikte secara keseluruhan akan berhasil

Dalam kasus penggunaan Anda, "perbandingan langsung dari dicts" atau

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
6 adalah solusi yang tepat

Semantik apa pun dari

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
7 (identitas dict, urutan, set, dan multiset) tidak akan berfungsi dalam kasus ini

Python membandingkan dua kunci dan nilai kamus
PeterL

Contoh yang lebih kompleks

d1 = {'Australia': ['Sydney', 'Melbourne'], 'Japan': ['Tokyo', 'Kyoto']}
d2 = {'AU': ['Sydney', 'Melbourne'], 'JP': ['Tokyo', 'Kyoto']}

Haruskah

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
_8 dibandingkan sama?

Pertimbangkan ini

d1 = {'Australia': ['Sydney', 'Melbourne'], 'Japan': ['Tokyo', 'Kyoto']}
d2 = {'AU': ['Tokyo', 'Kyoto'], 'JP': ['Sydney', 'Melbourne']}

Apakah Anda masih berpikir

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
_8 sebanding?
Saya tidak berpikir itu adalah perbandingan yang berguna

Ya, saya bisa melihatnya. Saya pikir contoh saya tidak bagus, tetapi saya masih mengerti maksud Anda
Dan saya mendapatkan bahwa perbandingan default untuk objek adalah identitas, dan itulah mengapa ini memberikan

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5

Saya masih khawatir tentang kembalinya

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5 sebagai perbandingan. Saya pikir itu menyesatkan, karena menyiratkan melakukan "perbandingan yang masuk akal". Bahwa itu selalu mengembalikan
# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
_5 (bahkan jika dibandingkan dengan diri sendiri) bisa membingungkan. (Saya mengerti mengapa itu terjadi, saya hanya mempertimbangkan apakah itu membantu atau membingungkan untuk melakukan itu. ) Saya perhatikan Julian di Edisi 12445 memiliki kebingungan yang sama, jadi saya curiga saya mungkin tidak sendirian. Ada perbedaan antara "tidak sebanding" dan "tidak sama". Tapi sayangnya == pada nilai mengembalikan _
# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5 (dalam pikiran saya, menyiratkan tidak sama) padahal artinya sebenarnya adalah "tidak sebanding"

Saya perhatikan bahwa dokumen menegaskan hal ini, tetapi itu mungkin bukan tempat pertama yang dilihat seseorang. Dan saya memakai topi pemikiran saya untuk kasus penggunaan yang baik

Salah satu opsinya adalah menaikkan NotImplemented, meskipun itu tidak biasa, dan mungkin ada masalah lain yang tidak saya sadari. Saya bertanya-tanya apakah

>>> "0" == 0
False
_5 mungkin relevan?

Atau, melakukan tes yang terdaftar di @rhettinger?

Baru saja melihat @rhettinger melakukan jajak pendapat Twitter tentang "apa yang dilakukan ini" - sangat tertarik untuk melihat hasilnya

Python membandingkan dua kunci dan nilai kamus
Quercus

Python membandingkan dua kunci dan nilai kamus
TimSpen210

Masalahnya adalah mencocokkan nilai untuk memeriksa kesetaraan

Python membandingkan dua kunci dan nilai kamus
rhettinger

Perhitungannya adalah O(n**2) adalah kasus umum …

Apakah kompleksitas perhitungan menjadi alasan utama mengapa perbandingan kesetaraan yang lebih bermakna tidak ditawarkan?

Bagaimana cara membandingkan dua kunci dan nilai kamus dengan Python?

Menggunakan == operator untuk Membandingkan Dua Kamus .

Bagaimana Anda membandingkan nilai dalam kamus Python?

Cara termudah untuk membandingkan kamus Python adalah dengan menggunakan operator kesetaraan yang sama dengan yang Anda gunakan pada jenis Python lainnya, “==” . Ini berfungsi dengan baik untuk sebagian besar kasus, tetapi bergantung pada perilaku "==" untuk nilai yang terlibat.

Bisakah Anda menggunakan == pada kamus dengan Python?

Menurut dokumen python, Anda memang dapat menggunakan operator == pada kamus .

Bagaimana Anda menemukan perbedaan antara dua kamus dengan Python?

Diberikan dua kamus dic1 dan dic2 yang mungkin berisi kunci yang sama, temukan perbedaan kunci dalam kamus yang diberikan. Kode #1. Menggunakan set untuk menemukan kunci yang hilang
Kode #2. Menemukan kunci di dict2 yang tidak ada di dict1