【问题标题】:How do I find the keys in one dictionary that do not have a counterpart in another dictionary?如何在一个字典中找到另一本字典中没有对应项的键?
【发布时间】:2016-02-17 21:14:16
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python dictionary set set-difference


    【解决方案1】:

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

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

    【讨论】:

    • 那是非常优雅的代码。只要可行,对字典进行集合操作通常更容易吗?
    • @user3426752,在这种情况下,是的,因为集合实现了交集和差异操作。如果您想要差异的实际字典,请参阅我的编辑。
    【解决方案2】:

    在 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()

    【讨论】:

    • 谢谢我。我刚看到这个。它可以更容易地查看其工作原理。所以你使用字典键作为一个集合?我不知道你能做到这一点。谢谢!
    • @user3426752 是的,有关字典视图对象的更多信息,请参阅here。准确地说,enrolled.keys() 返回一个“类似集合的视图对象”,其行为类似于不可变集合。当您编写set(enrolled) 时,通过迭代enrolled 的键并将它们复制到新的数据结构中来创建一个新的setenrolled.keys() 效率更高,因为它不复制密钥(尽管对于中等大小的数据可能可以忽略不计)。此外,它会自动反映字典键的变化。
    【解决方案3】:

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

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

    【讨论】:

    • 我不确定我是否理解。这段代码看起来可以让我找到参与但没有注册的人。我想我要找的是那些报名但没有参加的人。也许我没有把问题说清楚?还是我误解了你的答案?也许我正在寻找print "Difference: ", filter(lambda x:x not in participation, enrollments.keys()) 这会让我找到那些注册但没有参与的人吗?
    • @user3426752 我更新了我的答案,让你得到你需要的东西。
    • 谢谢,摩根。这真的很有帮助。 lambda 函数对我来说是新的,但我现在将开始阅读有关它们的文档。
    • @user3426752 它们不是经常被使用的东西,但了解它绝对是一件好事。我很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2019-04-14
    • 2015-08-02
    相关资源
    最近更新 更多