【问题标题】:Concise way to find "key" difference between 2 dictionaries?找到两个字典之间“关键”区别的简洁方法?
【发布时间】:2025-11-27 14:50:01
【问题描述】:

我需要比较 2 个字典以在一个字典中找到另一个字典中没有的键集。

我知道 Python set 对象支持:

set3=set1-set2

但我做不到:

dict3=dict1-dict2

或:

missingKeys=dict1.keys()-dict2.keys()

(我对最后一点有点惊讶,因为在 Java 中,键是一个 Set 对象。)一种解决方案是:

missingKeys=set(dict1.keys())-set(dict2.keys())

有没有更好或更简洁的方法来做到这一点?

【问题讨论】:

  • 我认为最后一行已经足够简洁了,但是......我想一个更有趣的问题是“如何从 X 中删除 Y 中的所有 z?”其中 X 和 Y 是列表。例如,如果 X 中存在重复的 z 而确实出现在 Y 中,这将很有用。
  • @pst:嗯,创建集合对象感觉有点奇怪,只是为了利用differ()函数...
  • 另一方面,因为它一个集合,它可以利用更好的 O ... 使用理解来处理列表差异,但有点啰嗦。不过,如果将“探测”列表转换为 set,性能仍然相同。

标签: python dictionary set set-difference


【解决方案1】:

Python 2.7:

>>> d = {1:2, 2:3, 3:4}
>>> d2 = {2:20, 3:30}
>>> set(d)-set(d2)
set([1])

Python 3.2:

>>> d = {1:2, 2:3, 3:4}
>>> d2 = {2:20, 3:30}
>>> d.keys()-d2.keys()
{1}

【讨论】:

  • 所以您是说 Python 3.2 dict.keys() 方法返回一个集合(如 Java)?早期版本没有这样做的任何原因?
  • @SamGoldberg:不,它实际上返回一个 dict_keys 对象,而不是一个集合,但它有许多类似集合的操作。见,例如this question.
  • d.keys() - d2 甚至 d - d2.keys() 也可以使用 :) 只是一般说明,恕我直言,它们的可读性较差。
  • 时间复杂度如何? d.keys()-d2.keys() 会按预期在 O(|len(d2)|) 中工作吗?
  • Python 2.7 具有 Python 3 的 .keys() 的反向端口,因此您也可以使用 d.viewkeys() - d2.viewkeys()
【解决方案2】:

也许

[x for x in dict1.keys() if x not in dict2.keys()]

【讨论】:

  • 我认为这可以更简洁一点:[x for x in dict1.keys() if x not in dict2] 因为x in dict.keys()x in dict 相同
  • @mgilson:只要你指出x in dictx in dict.keys()一样,那么完整的还原就是[x for x in dict1 if x not in dict2]
  • @SamGoldberg 你是对的。我没有想到的原因是因为for x in dict 在dict 上调用__iter__ 方法,而if x in dict 调用__contains__ 方法。所以,在这种情况下,in 做了两件不同的事情——它们恰好有相同的结果。无论如何:[x for x in dict1 if x not in dict2] 正如你所指出的那样最简洁。
  • 两个答案都很好,但接受这个答案是因为我使用的是 Python 2.7。作为 Python 新手,这个答案也帮助我更加了解 [for ... in ... if ...] 语法,这对我来说不如 d1-d2 语法自然。
  • 要计算值集之间的差异,您可以使用 Zbyszek Mandziejewicz 的响应中的集合。
【解决方案3】:

对于可移植的方式,我建议在 Python 2.7 中使用 dict.viewkeys - 它是 Python 3.x dict.keys 的反向移植,并由 2to3 自动转换。

例子:

>>> left = {1: 2, 2: 3, 3: 4}
>>> right = {2: 20, 3:30}
>>> left.viewkeys() - right.viewkeys()
set([1])

【讨论】:

    【解决方案4】:

    这应该适用于 Python 2.7 和 3.x:

    >>> keys = getattr(dict, 'viewkeys', dict.keys)
    >>> left = {1: 2, 2: 3, 3: 4}
    >>> right = {2: 20, 3:30} 
    >>> list(keys(left) - keys(right))
    [1]
    

    【讨论】:

      最近更新 更多