¿Una forma pythonica de comprobar si dos diccionarios tienen el mismo conjunto de claves?

Por ejemplo, digamos que tengo a los diccionarios:

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

y

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

¿Cuál es la forma más inteligente de verificar si los dos diccionarios contienen el mismo conjunto de claves? En el ejemplo anterior, debería devolver False porque d_2 contiene la clave 'alan' , que d_1 no. Tenga en cuenta que no estoy interesado en verificar que los valores asociados para cada una de las claves sean iguales, solo que el conjunto de claves es el mismo.

Puede obtener las claves para un diccionario con dict.keys ().

Puedes convertir esto en un set con set (dict.keys ())

Puedes comparar conjuntos con ==

Para resumir:

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

Te daré lo que quieras.

En Python2,

 set(d_1) == set(d_2) 

En Python3, puedes hacer esto, que puede ser un poco más eficiente que crear conjuntos.

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

Aunque la forma Python2 funcionaría también

  • En Python 3, dict.keys() devuelve un ” objeto de vista ” que se puede usar como un conjunto. Esto es mucho más eficiente que construir un conjunto separado.

     d_1.keys() == d_2.keys() 
  • En Python 2.7, dict.viewkeys() hace lo mismo.

     d_1.viewkeys() == d_2.viewkeys() 
  • En Python 2.6 y más abajo, debes construir un conjunto de las claves de cada dictado.

     set(d_1) == set(d_2) 

    O puede iterar sobre las teclas para una mayor eficiencia de la memoria.

     len(d_1) == len(d_2) and all(k in d_2 for k in d_1) 
 >>> not set(d_1).symmetric_difference(d_2) False >>> not set(d_1).symmetric_difference(dict.fromkeys(d_1)) True 

Una forma es verificar la diferencia simétrica (nuevo conjunto con elementos en s o t, pero no en ambos):

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

Pero una forma más corta es simplemente comparar los sets:

 set(d_1) == set(d_2) 

Una opción rápida (no estoy seguro de si es la más óptima)

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