如何检查一个字典是否是另一个较大字典的子集?

168 投票
19 回答
106137 浏览
提问于 2025-04-17 13:09

我正在尝试写一个自定义的过滤方法,这个方法可以接收任意数量的 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()的方法。

http://docs.python.org/2/library/unittest.html?highlight=assertdictcontainssubset#unittest.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())

优化的部分留给读者自己去练习。

撰写回答