Tôi hiện đang sử dụng chức năng sau để so sánh các giá trị từ điển và hiển thị tất cả các giá trị không khớp. Có cách nào nhanh hơn hoặc tốt hơn để làm điều đó không?
match = True
for keys in dict1:
if dict1[keys] != dict2[keys]:
match = False
print keys
print dict1[keys],
print '->' ,
print dict2[keys]
Chỉnh sửa: Cả hai dicts đều chứa các khóa giống nhau.
Dag Høidahl
7.4337 Huy hiệu vàng52 Huy hiệu bạc65 Huy hiệu Đồng7 gold badges52 silver badges65 bronze badges
Đã hỏi ngày 15 tháng 12 năm 2009 lúc 23:39Dec 15, 2009 at 23:39
ngẫu nhiênThoughTrandomth thinkrandomThought
5.95315 Huy hiệu vàng54 Huy hiệu bạc71 Huy hiệu Đồng15 gold badges54 silver badges71 bronze badges
4
Nếu ý định thực sự của câu hỏi là so sánh giữa các dicts [chứ không phải in sự khác biệt], thì câu trả lời là
dict1 == dict2
Điều này đã được đề cập trước đây, nhưng tôi cảm thấy nó hơi chết đuối trong các bit thông tin khác. Nó có thể xuất hiện hời hợt, nhưng so sánh giá trị của dicts có ngữ nghĩa thực sự mạnh mẽ. Nó bao gồm
- Số phím [nếu chúng không khớp, các dicts không bằng nhau]
- Tên của các phím [nếu chúng không khớp, chúng không bằng nhau]
- Giá trị của mỗi khóa [chúng phải là '==', quá]
Điểm cuối cùng một lần nữa xuất hiện tầm thường, nhưng rất thú vị vì điều đó có nghĩa là tất cả những điều này cũng được áp dụng đệ quy cho các dicts lồng nhau. Ví dụ.applies recursively to nested dicts as well. E.g.
m1 = {'f':True}
m2 = {'f':True}
m3 = {'a':1, 2:2, 3:m1}
m4 = {'a':1, 2:2, 3:m2}
m3 == m4 # True
Tương tự ngữ nghĩa tồn tại để so sánh danh sách. Tất cả điều này làm cho nó không có trí tuệ để ví dụ: So sánh các cấu trúc JSON sâu, một mình với một "==" đơn giản.
Đã trả lời ngày 12 tháng 4 năm 2011 lúc 12:39Apr 12, 2011 at 12:39
15
Nếu các dicts có các bộ khóa giống hệt nhau và bạn cần tất cả các bản in cho bất kỳ sự khác biệt giá trị nào, bạn không thể làm được gì nhiều; Có thể một cái gì đó như:
diffkeys = [k for k in dict1 if dict1[k] != dict2[k]]
for k in diffkeys:
print k, ':', dict1[k], '->', dict2[k]
Khá nhiều tương đương với những gì bạn có, nhưng bạn có thể nhận được bản trình bày đẹp hơn bằng cách sắp xếp DiffKeys trước khi bạn lặp trên nó.
Đã trả lời ngày 16 tháng 12 năm 2009 lúc 1:36Dec 16, 2009 at 1:36
Alex Martellialex MartelliAlex Martelli
827K163 Huy hiệu vàng1204 Huy hiệu bạc1383 Huy hiệu Đồng163 gold badges1204 silver badges1383 bronze badges
1
Bạn cũng có thể sử dụng các bộ cho điều này
>>> a = {'x': 1, 'y': 2}
>>> b = {'y': 2, 'x': 1}
>>> set[a.iteritems[]]-set[b.iteritems[]]
set[[]]
>>> a['y']=3
>>> set[a.iteritems[]]-set[b.iteritems[]]
set[[['y', 3]]]
>>> set[b.iteritems[]]-set[a.iteritems[]]
set[[['y', 2]]]
>>> set[b.iteritems[]]^set[a.iteritems[]]
set[[['y', 3], ['y', 2]]]
Đã trả lời ngày 16 tháng 12 năm 2009 lúc 1:47Dec 16, 2009 at 1:47
John La Rooyjohn La RooyJohn La Rooy
Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges
2
Uhm, bạn đang mô tả
dict1 == dict2
4 [kiểm tra xem cả hai đều có bằng nhau]Nhưng những gì mã của bạn làm là
dict1 == dict2
5 [kiểm tra xem tất cả các mục trong dict1 có bằng với các mục trong Dict2]Đã trả lời ngày 15 tháng 12 năm 2009 lúc 23:45Dec 15, 2009 at 23:45
Jochen Ritzeljochen RitzelJochen Ritzel
102K30 Huy hiệu vàng196 Huy hiệu bạc191 Huy hiệu Đồng30 gold badges196 silver badges191 bronze badges
1
Không chắc chắn nếu điều này có ích nhưng trong ứng dụng của tôi, tôi phải kiểm tra xem một từ điển có thay đổi không.
Làm điều này sẽ không hoạt động vì về cơ bản, nó vẫn là cùng một đối tượng:
val={'A':1,'B':2}
old_val=val
val['A']=10
if old_val != val:
print['changed']
Sử dụng Copy/DeepCopy Works:
import copy
val={'A':1,'B':2}
old_val=copy.deepcopy[val]
val['A']=10
if old_val != val:
print['changed']
Đã trả lời ngày 28 tháng 4 năm 2016 lúc 8:53Apr 28, 2016 at 8:53
>>> a = {'x': 1, 'y': 2}
>>> b = {'y': 2, 'x': 1}
>>> print a == b
True
>>> c = {'z': 1}
>>> print a == c
False
>>>
Đã trả lời ngày 15 tháng 12 năm 2009 lúc 23:45Dec 15, 2009 at 23:45
Jochen Ritzeljochen Ritzelyedpodtrzitko
102K30 Huy hiệu vàng196 Huy hiệu bạc191 Huy hiệu Đồng2 gold badges36 silver badges39 bronze badges
Không chắc chắn nếu điều này có ích nhưng trong ứng dụng của tôi, tôi phải kiểm tra xem một từ điển có thay đổi không.
if not dict1 == dict2:
match = False
Làm điều này sẽ không hoạt động vì về cơ bản, nó vẫn là cùng một đối tượng:
for key in dict1:
if not key in dict2 or dict1[key] != dict2[key]:
match = False
Sử dụng Copy/DeepCopy Works:
dict1 == dict2
0Đã trả lời ngày 28 tháng 4 năm 2016 lúc 8:53
Đã trả lời ngày 15 tháng 12 năm 2009 lúc 23:45Dec 15, 2009 at 23:45
3
Jochen Ritzeljochen Ritzel
//docs.python.org/3/library/stdtypes.html#dict-views
dict1 == dict2
1102K30 Huy hiệu vàng196 Huy hiệu bạc191 Huy hiệu Đồng
Không chắc chắn nếu điều này có ích nhưng trong ứng dụng của tôi, tôi phải kiểm tra xem một từ điển có thay đổi không.
dict1 == dict2
2Làm điều này sẽ không hoạt động vì về cơ bản, nó vẫn là cùng một đối tượng:Mar 30, 2020 at 16:34
Sử dụng Copy/DeepCopy Works:
dict1 == dict2
3Đã trả lời ngày 28 tháng 4 năm 2016 lúc 8:53
yedpodtrzitkoyedpodtrzitko♦
8,5112 Huy hiệu vàng36 Huy hiệu bạc39 Huy hiệu Đồng12 gold badges96 silver badges132 bronze badges
Nếu bạn chỉ so sánh với sự bình đẳng, bạn có thể làm điều này:Aug 13, 2015 at 2:32
3