2010-05-11 4 views
8

je le dictionnaire suivant:Comment vérifiez-vous la présence de nombreuses clés dans un dictionnaire Python?

sites = { 
    'stackoverflow': 1, 
    'superuser': 2, 
    'meta': 3, 
    'serverfault': 4, 
    'mathoverflow': 5 
} 

Pour vérifier s'il y a plus d'une clé disponible dans le dictionnaire ci-dessus, je vais faire quelque chose comme:

'stackoverflow' in sites and 'serverfault' in sites 

Ce qui précède est maintenable avec seulement 2 recherches clés. Y at-il une meilleure façon de gérer la vérification d'un grand nombre de clés dans un très grand dictionnaire?

Répondre

12

Vous pouvez prétendre les clés du dict sont un ensemble, puis utilisez set.issubset:

set(['stackoverflow', 'serverfault']).issubset(sites) # ==> True 

set(['stackoverflow', 'google']).issubset(sites) # ==> False 
9

Vous pouvez utiliser all:

print(all(site in sites for site in ('stackoverflow','meta'))) 
# True 
print(all(site in sites for site in ('stackoverflow','meta','roger'))) 
# False 
+0

+1 pour tous et l'expression du générateur, mais -1 pour parens supplémentaires sur '(_ dans les sites) 'et pour utiliser' _' comme nom de variable. Je me rends compte que tout ce que vous utilisez est une variable jetable, mais '_' en tant que nom de variable ne fait que ralentir ma compréhension. Pourquoi ne pas simplement 'all (s dans les sites pour s dans ('stackoverflow', 'meta'))'. Cela a en fait un avantage sur la solution basée sur l'ensemble, car il n'est pas nécessaire de construire un ensemble de la longue liste de sites à vérifier, et 'tout 'court-circuera dès que la première discordance est trouvée. – PaulMcG

+0

@Paul, merci pour votre commentaire. Que puis-je dire, mais, je suis d'accord! – unutbu

+0

+1 pour votre jugement perspicace de mérite technique! – PaulMcG

0

Combien de recherches vous envisagez de faire? Je pense que la méthode que vous utilisez est bien. S'il existe des dizaines, des centaines, etc. de clés comparées, vous pouvez placer toutes les clés cibles dans une liste, puis parcourir la liste en vérifiant que chaque élément se trouve dans le dictionnaire.

1
mysites = ['stackoverflow', 'superuser'] 
[i for i in mysites if i in sites.keys()] # ==> sites in the list mysites that are in your dictionary 
[i for i in mysites if i not in sites.keys()] # ==> sites in the list mysites that are not in your dictionary 
+0

Vous n'avez pas besoin de '.keys()' et vous ne devriez probablement pas l'utiliser. Il crée une liste dont vous n'avez pas besoin et change votre instruction 'in' en O (n) au lieu de O (1) sans elle. En plus de cela, c'est une façon très lisible d'obtenir une liste des sites qui ne font pas partie du dictionnaire. – tgray

Questions connexes