Python是否存在标准函数可实现两个字典的差异对比
回答
Python标准库没有提供直接返回你定义的四类字典差异结果的专用函数,但依托Python 3开始内置的字典视图集合运算特性,只需要少量代码就能完整实现你需要的CompareTwoDict类全部功能,无需依赖任何第三方包。
字典的keys()、items()方法返回的视图对象原生支持集合的交、并、差运算,刚好匹配四类对比场景的逻辑:
- 新增条目:对两个字典的键集合做差集,拿到dict2独有、dict1不存在的键,提取对应值即可
- 删除条目:同理拿到dict1独有、dict2不存在的键,提取对应值即可
- 修改条目:先拿到两个字典共有的键,筛选出同键下值不相等的项,返回dict2中对应的值
- 共有条目:直接对两个字典的
items()视图取交集,由于items()返回的是(键, 值)元组,元组相等就代表键和值完全匹配
完整可直接运行的实现代码如下:
class CompareTwoDict: def __init__(self, dict1, dict2) -> None: self._dict1 = dict1 self._dict2 = dict2 def added_from_dict1(self): add_keys = self._dict2.keys() - self._dict1.keys() return {k: self._dict2[k] for k in add_keys} def deleted_from_dict1(self): del_keys = self._dict1.keys() - self._dict2.keys() return {k: self._dict1[k] for k in del_keys} def modified_from_dict1(self): common_keys = self._dict1.keys() & self._dict2.keys() return {k: self._dict2[k] for k in common_keys if self._dict1[k] != self._dict2[k]} def common_between_dict1_dict2(self): return dict(self._dict1.items() & self._dict2.items())
注意:上述实现仅适用于字典值可哈希、支持
==判等的场景。如果字典存在嵌套列表、嵌套字典这类不可哈希的值,直接对items()做集合运算会抛出类型错误,这种场景需要自行编写递归对比逻辑。标准库没有提供内置的嵌套字典深度对比能力,如果不需要严格限制标准库依赖,可以用第三方库deepdiff实现全场景的差异识别,但它不属于Python官方标准库范畴。
简单的功能验证示例:
d1 = {"name": "Zhang", "age": 25, "city": "Beijing"} d2 = {"name": "Zhang", "age": 26, "job": "engineer"} cmp = CompareTwoDict(d1, d2) print(cmp.added_from_dict1()) # {'job': 'engineer'} print(cmp.deleted_from_dict1()) # {'city': 'Beijing'} print(cmp.modified_from_dict1()) # {'age': 26} print(cmp.common_between_dict1_dict2())# {'name': 'Zhang'}
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

