在Python中,如何在一个字典中找到没有另一个字典中对应字符的键?实际问题是,我有一本人员的字典,这些人员已经注册,并且他们每天都会参与字典,我正在努力寻找那些已经注册但没有参加的人,或者是在注册词典中,而不是在参与字典中。
在Python食谱中,我找到了交叉口注册和参与的好代码,或两个字典的交集:
print "Intersection: ", filter(enrollments.has_key, participation.keys())
但是我无法弄清楚如何将这个逻辑扩展到正面(?)的情况。我试过把一个不在参数前面。()但是我收到了一个错误。有没有办法将过滤器中的逻辑扩展到我的问题或完全接近它的另一种方法?
答案 0 :(得分:6)
使用键上的设置来查找差异:
>>> 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}
答案 1 :(得分:2)
您可以使用lambda
作为过滤的第一个参数。
print "Intersection: ", filter(lambda x:x not in participation, enrollments)
答案 2 :(得分:1)
在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()