如何检查一个字典是否是另一个较大字典的子集?
我正在尝试写一个自定义的过滤方法,这个方法可以接收任意数量的 kwargs,并返回一个列表,这个列表包含了像数据库一样的列表中那些包含这些 kwargs 的元素。
举个例子,假设有 d1 = {'a':'2', 'b':'3'}
,还有 d2
也是一样的内容。那 d1 == d2
的结果就是 True。但是如果 d2
是相同的内容加上一堆其他的东西,我的方法需要能够判断 d1 是否在 d2 中,但 Python 对字典是做不到这一点的。
背景:
我有一个 Word 类,每个对象都有一些属性,比如 word
(单词)、definition
(定义)、part_of_speech
(词性)等等。我想在这些单词的主列表上调用一个过滤方法,比如 Word.objects.filter(word='jump', part_of_speech='verb-intransitive')
。我搞不清楚怎么同时管理这些键和值。不过,这个方法在其他场景下也可能有更大的用处。
19 个回答
44
给需要进行单元测试的朋友们一个提示:在Python的TestCase
类里,还有一个叫assertDictContainsSubset()
的方法。
不过,这个方法在3.2版本中已经被弃用了,不太清楚原因,可能是有新的替代方法了。
217
在Python 3中,你可以使用 dict.items()
来获取字典中所有项目的一个类似集合的视图。然后你可以用 <=
操作符来检查一个视图是否是另一个视图的“子集”。
d1.items() <= d2.items()
在Python 2.7中,你可以使用 dict.viewitems()
来实现同样的功能。
d1.viewitems() <= d2.viewitems()
在Python 2.6及更早的版本中,你需要用不同的方法,比如使用 all()
。
all(key in d2 and d2[key] == d1[key] for key in d1)
148
把内容转换成成对的项目,然后检查这些项目是否包含在内。
all(item in superset.items() for item in subset.items())
优化的部分留给读者自己去练习。