Python如何检查一个字典是否为另一个字典的一部分

3

我有两个包含相同键的字典

dict1 = {'version': 222,'name_app': 'foo1'}
dict2 = {'version': 222,'name_app': 'foo1','dir': 'c','path': 'cc'}

现在我想检查dict1是否与dict2具有相同的键和值。我希望避免使用循环并且检查dict1中的每个键和值是否都在dict2中。

有没有一种Python风格优美的方法来实现这个功能?
更新:
如果仅有一个匹配项,则dict1的两个键必须都在dict2中,否则返回false。


我读过Dan Badler写的《Python Trick Book》,没遇到过这样的问题。我认为你需要使用循环或生成器。 - Salman
3个回答

3

你可以像这样做

set(dict1.items())-set(dict2.items())== set()

根据您的条件,它将返回true或false。

如果字典有列表:

from operator import *
g = itemgetter(*dict1)
print(dict1.keys() <= dict2.keys() and g(dict1) == g(dict2))

唯一的问题是当字典包含列表时,它将无法工作并显示以下错误: {TypeError}unhashable type: 'list' - user63898
如果你想使用itemgetter来完成这个任务,那么你可以这样做。 - Harshit Garg

1
我会使用 operator.itemgetter
from operator import itemgetter

dict1 = {"version": 222, "name_app": "foo1"}
dict2 = {"version": 222, "name_app": "foo1", "dir": "c", "path": "cc"}

g = itemgetter(*dict1)
print(g(dict1) == g(dict2))

输出:

True

编辑:dict1的所有键都必须匹配:

from operator import itemgetter

dict1 = {"version": 222, "name_app": "foo1"}
dict2 = {"version": 222, "name_app": "foo1", "dir": "c", "path": "cc"}

g = itemgetter(*dict1)
print(dict1.keys() <= dict2.keys() and g(dict1) == g(dict2))

输出:

True

编辑2:如果字典具有列表值:

from operator import itemgetter

dict1 = {"version": 222, "name_app": ["a", "b", "c"]}
dict2 = {"version": 222, "name_app": ["a", "b", "c"], "dir": "c", "path": "cc"}

g = itemgetter(*dict1)
print(dict1.keys() <= dict2.keys() and g(dict1) == g(dict2))

输出:

True

也更新了问题,dict1的所有键都必须匹配。 - user63898
1
是的,我看到了,给你目前的答案,谢谢! - user63898
有没有办法使dict2的值变成小写? - user63898
@user63898 是的,有一种方法,但它需要使用显式for循环(使dict2中的所有键都变为小写)。 - Andrej Kesely
有没有办法仅将字典1中存在的键转换为小写?而不是整个字典2? - user63898
显示剩余4条评论

0

你可以做到这个

dict1 = {'version': 222,'name_app': 'foo1'}
dict2 = {'version': 222,'name_app': 'for','dir': 'c','path': 'cc'}
common=set(dict1.items())-set(dict2.items())
print(list(common)!=[])

还更新了问题,dict1的所有键都必须匹配。在你的例子中,即使有1个键匹配,也会返回true。 - user63898

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接