【问题标题】:Pythonic way to check if two dictionaries have the identical set of keys?检查两个字典是否具有相同的键集的 Pythonic 方法?
【发布时间】:2010-07-09 07:59:55
【问题描述】:

例如,假设我要字典:

d_1 = {'peter': 1, 'adam': 2, 'david': 3}

d_2 = {'peter': 14, 'adam': 44, 'david': 33, 'alan': 21}

检查两个字典是否包含同一组键的最聪明的方法是什么?在上面的示例中,它应该返回False,因为d_2 包含'alan' 键,而d_1 没有。

我对检查关联值是否匹配不感兴趣。只是想确定密钥是否相同。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    在 Python2 中,

    set(d_1) == set(d_2)
    

    在 Python3 中,您可以这样做,这可能比创建集合更有效

    d1.keys() == d2.keys()
    

    虽然 Python2 方式也可以工作

    【讨论】:

      【解决方案2】:

      您可以使用dict.keys() 获取字典的键。

      你可以用set(dict.keys())把它变成一个集合

      你可以用==比较集合

      总结一下:

      set(d_1.keys()) == set(d_2.keys())
      

      会给你你想要的。

      【讨论】:

      • 没错,您不需要密钥,但如果您不经常使用集合,我会说 set(dictionary) 的行为并不明显。有谁知道使用键是否会影响性能?
      • @xorsyst: 在 Python 2 中 iter(a_dict) 返回一个迭代器,a_dict.keys() 返回一个列表;因此,set(d_1.keys()) 会导致创建和销毁字典键的临时列表。在 Python 3 中,它们是等价的。
      • @xorsyst:这种行为有什么不明显的?使用 set(some_dict) 时还应该做什么?当你做 list(some_dict) 时也是同样的行为,它也会返回一个键列表
      • @Joschua:如果您熟悉 list(some_dict),那么我同意 set(some_dict) 应该很明显。但对我来说,这些方法是否会以它们的方式工作并不明显。我的第一个期望是 list(some_dict) 将是 (key, value) 元组的列表。我同意只返回键是一种有用的行为,但我不会说它是“显而易见的”。
      • 为什么要将dict_keys元素转换为sets?
      【解决方案3】:
      • 在 Python 3 中,dict.keys() 返回一个可以像集合一样使用的“view object”。这比构造一个单独的集合要高效得多。

        d_1.keys() == d_2.keys()
        
      • 在 Python 2.7 中,dict.viewkeys() 做同样的事情。

        d_1.viewkeys() == d_2.viewkeys()
        
      • 在 Python 2.6 及以下版本中,您必须为每个 dict 构造一组键。

        set(d_1) == set(d_2)
        

        或者您可以自己迭代键以提高内存效率。

        len(d_1) == len(d_2) and all(k in d_2 for k in d_1)
        

      【讨论】:

        【解决方案4】:
        >>> not set(d_1).symmetric_difference(d_2)
        False
        >>> not set(d_1).symmetric_difference(dict.fromkeys(d_1))
        True
        

        【讨论】:

          【解决方案5】:

          一个快速的选项(不确定它是否是最佳的)

          len(set(d_1.keys()).difference(d_2.keys())) == 0
          

          【讨论】:

          • 如果键相同但值不同,SilentGhost的回复将返回false
          • 检查 len == 0 可能是最不符合 Python 标准的事情。
          • @Alex 不。自己试试吧。
          【解决方案6】:

          一种方法是检查symmetric difference(新集合中的元素位于 s 或 t 但不是两者中):

          set(d_1.keys()).symmetric_difference(set(d_2.keys()))
          

          但更短的方法是比较集合:

          set(d_1) == set(d_2)
          

          【讨论】:

            猜你喜欢
            • 2013-01-04
            • 2013-05-07
            • 1970-01-01
            • 2014-12-27
            • 2021-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多