在Python中,如何找到一个字典中在另一字典中没有对应项的键?实际问题是,我有一本注册人员的字典和一本包含他们日常参与情况的字典,我试图找到注册但未参与的人,或者在注册字典中但不在参与字典中的人。
在 Python 食谱中,我找到了用于交集注册和参与或两个字典的交集的良好代码:
print "Intersection: ", filter(enrollments.has_key, participation.keys())
但我不知道如何将这个逻辑扩展到正面(?)的情况。我尝试在participation.keys() 前面添加 not,但出现错误。有没有办法将过滤器中的逻辑扩展到我的问题或另一种方法来完全解决它?
使用按键上的集合来找出差异:
>>> 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}
在 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()
lambda
作为过滤器的第一个参数。
print "Intersection: ", filter(lambda x:x not in participation, enrollments)