如何在一本字典中找到在另一本字典中没有对应项的键?

How do I find the keys in one dictionary that do not have a counterpart in another dictionary?

在 Python 中,如何在一个字典中找到在另一个字典中没有对应项的键?实际问题是我有一本注册人员字典和一本他们日常参与的字典,我试图找到注册但没有参与的人,或者在注册字典中而不在参与字典中的人。

在 Python 食谱中,我找到了很好的交集 enrollments 和 participation 代码,或者两个字典的交集:

print "Intersection: ", filter(enrollments.has_key, participation.keys())

但我不知道如何将此逻辑扩展到正面 (?) 情况。我试过在 participation.keys() 前面放一个 not 但我得到一个错误。有没有一种方法可以将过滤器中的逻辑扩展到我的问题或另一种方法来完全解决它?

您可以使用 lambda 作为过滤器的第一个参数。

print "Intersection: ", filter(lambda x:x not in participation, enrollments)

在键上使用集合来找出不同之处:

>>> P = dict(zip('a b c d'.split(),[1,2,3,4]))
>>> E = dict(zip('a b e f'.split(),[6,7,8,9]))
>>> set(P)-set(E)
{'d', 'c'}
>>> set(E)-set(P)
{'f', 'e'}

此外,您可以使用字典理解。这是一种跨字典映射函数的方法,and/or 过滤内容。语法意味着 return 字典项中每个键和值的 key:value 对,其中键不在另一个字典中:

>>> {k:v for k,v in P.items() if k not in E}
{'d': 4, 'c': 3}
>>> {k:v for k,v in E.items() if k not in P}
{'f': 9, 'e': 8}

在 Python 3 中,dict.keys() 为您提供字典中键的类似集合的视图,因此这样做非常简单:

>>> enrolled = {'steve': 0, 'mike': 42, 'judy': 100}
>>> participated = {'judy': 5, 'mike': 10}
>>> enrolled.keys() - participated.keys()
{'steve'}

在Python2中,将.keys()替换为.viewkeys()