7

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

在 Python 食谱中,我找到了交叉注册和参与的好代码,或者两个字典的交叉:

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

但我不知道如何将此逻辑扩展到反(?)案例。我尝试在participation.keys() 前面加上not,但出现错误。有没有办法将过滤器中的逻辑扩展到我的问题或完全解决问题的另一种方法?

4

3 回答 3

10

使用键上的集合来找出差异:

>>> 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'}

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

>>> {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}
于 2015-11-16T17:22:24.510 回答
5

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

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

在 Python 2 中,替换.keys().viewkeys()

于 2015-11-16T17:39:01.837 回答
2

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

print "Intersection: ", filter(lambda x:x not in participation, enrollments)
于 2015-11-16T17:22:13.413 回答