我陷入了一个非常简单的问题。我需要在Python 3中实现检查和减号功能,该功能可以先执行检查,然后对字典进行减法。 例如:
d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}
result = check(d1, d2)
检查函数比较两个字典,如果第一个参数大于第二个参数,则返回True
;如果第二个字典较大,则返回False
。
在此示例中,结果应返回False
,因为d2
具有"e:2"
,而d1
没有。
简而言之,我想实现一个检查函数,该函数仅在d2
是d1
的子集时返回True,这意味着d1
包含d2
的所有键,对于每个键的值,d1
也大于d2
。
检查功能应该能够检查d1
是否包含d2
的所有键,并且d1
的值是否大于d2
(我不知道希望减法后任何负值都出现在新字典(d3)中。)
我相信在Python 3中有一种非常简单的方法来实现此功能。
答案 0 :(得分:0)
Python字典具有keys()
方法,可让您访问字典中的键。关于从keys()
返回的对象的一件好事是,它的行为类似于set,因此您可以轻松地测试一个对象是否是另一个对象的超集/子集:
d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}
d1.keys() >= d2.keys()
# false
您可以使用all()
来确定列表中的每个值是否为true,因此一旦知道d1是d2的超集,就可以查看是否:
all(d1[k] >= d2[k] for k in d2)
是真的。
您可以将它们组合在一起
d1.keys() >= d2.keys() and all(d1[k] >= d2[k] for k in d2)
但是顺序很重要-首先需要检查d1
是否具有d2
中的所有键,否则在尝试查找时all()
中的表达式将引发异常一个不存在的密钥。如果第一部分为false而不检查第二部分,则上面的内容将返回false,因此您可以按此顺序避免该错误。
答案 1 :(得分:0)
在@Mark Meyer的帮助下,我进行了修改
def check(d1:dict, d2:dict)->bool:
return set(d2)<=set(d1)