2010-07-09 2 views
13

Par exemple, disons que je dois dictionnaires:façon Pythonic pour vérifier si deux dictionnaires ont le même ensemble de clés?

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

et

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

Quelle est la façon de vérifier intelligent si les deux dictionnaires contiennent le même jeu de clés? Dans l'exemple ci-dessus, il doit retourner False car d_2 contient la clé 'alan', qui d_1 ne fonctionne pas. S'il vous plaît noter que je ne suis pas intéressé à vérifier que les valeurs associées pour chaque clé sont les mêmes, juste que l'ensemble des touches sont les mêmes.

Répondre

18

Vous pouvez obtenir les clés d'un dictionnaire avec dict.keys().

Vous pouvez en faire un ensemble avec l'ensemble (dict.keys())

Vous pouvez comparer des ensembles avec ==

Pour résumer:

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

vous donnera ce que tu veux.

+0

vous n'avez pas besoin de 'keys'. – SilentGhost

+1

Encore plus simple que ça, puisque set (dict) donne juste les clefs ... –

+1

Certes, vous n'avez pas besoin des touches, mais si vous n'utilisez pas de set très souvent je dirais que le comportement de set (dictionnaire) n'est pas évident. Est-ce que quelqu'un sait si l'utilisation de clés introduit un coup de performance? – xorsyst

0
>>> not set(d_1).symmetric_difference(d_2) 
False 
>>> not set(d_1).symmetric_difference(dict.fromkeys(d_1)) 
True 
-1

Une option rapide (pas sûr si son plus optimal)

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

réponse de SilentGhost retourne false si les touches sont les mêmes, mais les valeurs sont différentes – Alex

+2

Vérification des len == 0 est probablement la chose la plus unpythonic. – SilentGhost

+0

@Alex Non. Essayez-le vous-même. – augurar

24

En python2,

set(d_1) == set(d_2) 

En python3, vous pouvez le faire qui peut être un petit peu plus efficace que la création d'ensembles

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

une ien la façon python2 fonctionnerait trop

+1

+1 pour le Python 3 way – Joschua

0

Une façon est de vérifier symmetric difference (nouvelle série avec des éléments dans les deux s ou t mais pas les deux):

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

Mais un chemin plus court pour comparer juste les jeux :

set(d_1) == set(d_2) 
2
  • En Python 3, dict.keys() retourne un "view object" qui peut être utilisé comme un ensemble. C'est beaucoup plus efficace que de construire un ensemble distinct.

    d_1.keys() == d_2.keys() 
    
  • En Python 2.7, dict.viewkeys() fait la même chose.

    d_1.viewkeys() == d_2.viewkeys() 
    
  • En Python 2.6 et ci-dessous, vous devez construire un ensemble des clés de chaque dict. Ou vous pouvez parcourir vous-même les clés pour une plus grande efficacité de la mémoire.

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