如何实现可以比较字典的功能?

时间:2019-07-13 06:50:22

标签: python python-3.x list dictionary subset

我陷入了一个非常简单的问题。我需要在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没有。

简而言之,我想实现一个检查函数,该函数仅在d2d1的子集时返回True,这意味着d1包含d2的所有键,对于每个键的值,d1也大于d2

检查功能应该能够检查d1是否包含d2的所有键,并且d1的值是否大于d2(我不知道希望减法后任何负值都出现在新字典(d3)中。)

我相信在Python 3中有一种非常简单的方法来实现此功能。

2 个答案:

答案 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)