检查两个字典是否有相同的键集的Python方法?

检查两个字典是否有相同的键集的Python方法?,python,dictionary,Python,Dictionary,例如,假设我必须使用字典: d_1 = {'peter': 1, 'adam': 2, 'david': 3} 及 检查这两个字典是否包含同一组键的最聪明的方法是什么?在上面的示例中,它应该返回False,因为du2包含'alan'键,而du1不包含该键 我对检查关联的值是否匹配不感兴趣。只想确定按键是否相同。一个快速选项(不确定是否是最佳选项) >>> not set(d_1).symmetric_difference(d_2) False >>> not

例如,假设我必须使用字典:

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

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

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

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

>>> not set(d_1).symmetric_difference(d_2)
False
>>> not set(d_1).symmetric_difference(dict.fromkeys(d_1))
True
在Python2中

set(d_1) == set(d_2)
在Python3中,您可以做到这一点,这可能比创建集合更有效

d1.keys() == d2.keys()
虽然Python2方法也能起作用,但一种方法是检查(新集合中的元素要么是s,要么是t,而不是两者):

但一种简单的方法是比较集合:

set(d_1) == set(d_2)

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

您可以使用
set(dict.keys())

您可以将集合与
==

总而言之:

set(d_1.keys()) == set(d_2.keys())
会给你想要的。

  • 在Python 3中,返回一个可以像集合一样使用的“”。这比构造一个单独的集合要有效得多

    d_1.keys() == d_2.keys()
    
  • 在Python2.7中,执行相同的操作

    d_1.viewkeys() == d_2.viewkeys()
    
  • 在Python2.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)
    

SilentGhost的回复将返回false,如果键相同,但值不同。检查len==0可能是最不和谐的事情。@Alex否。你自己试试。没错,你不需要钥匙,但是如果你不经常使用集合,我会说集合(字典)的行为是不明显的。有人知道使用键是否会导致性能下降吗?@xorsyst:python2
iter(a_dict)
返回一个迭代器,
a_dict.keys()
返回一个列表;因此,
set(d_1.keys())
将创建和销毁字典键的临时列表。在Python3中,它们是等价的。@xorsyst:这种行为有什么不明显的地方?使用set(某些命令)时还应该做什么?当您执行list(some_dict)时,这也是相同的行为,它还返回keys@Joschua:如果你熟悉列表(一些词汇),那么我同意set(一些词汇)应该是非常明显的。但对我来说,这一点都不明显,这些将工作的方式,他们做。我的第一个期望是列表(一些dict)将是(键,值)元组的列表。我同意只返回键是一种有用的行为,但我不会说这是“明显的”。为什么要将
dict\u键
元素转换为
set
s?
d_1.viewkeys() == d_2.viewkeys()
set(d_1) == set(d_2)
len(d_1) == len(d_2) and all(k in d_2 for k in d_1)