2010-08-05 2 views

Répondre

20

Vous pouvez utiliser set.issubset(...), comme ceci:

>>> d = {'a': 1, 'b': 2, 'c': 3} 
>>> set(['a', 'b']).issubset(d) 
True 
>>> set(['a', 'x']).issubset(d) 
False 

Python 3 a mis en place un ensemble syntaxe littérale qui a été rétroportés à Python 2.7, donc ces jours-ci peut être écrit au-dessus:

>>> d = {'a': 1, 'b': 2, 'c': 3} 
>>> {'a', 'b'}.issubset(d) 
True 
>>> {'a', 'x'}.issubset(d) 
False 
+0

set (sub_dict) .issubset (parent_dict) semble fonctionner aussi, et c'est plus simple pour moi. Mais merci pour le pointeur :) – trojjer

20
if all(test in d for test in ('a','b','c')): 
    # do something 
1

pouvez utiliser un itemgetter enveloppé dans un try/except.

>>> from operator import itemgetter 
>>> d = dict(a=1,b=2,c=3,d=4) 
>>> e = dict(a=1,b=2,c=3,e=4) 
>>> getter=itemgetter('a','b','c','d') 
>>> getter(d) 
(1, 2, 3, 4) 
>>> getter(e) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'd' 

Mais en réalité, je préfère la solution de Paul McGuire

5

En python3 vous pouvez écrire

set("abc")<=d.keys() 

En python2.7 vous pouvez écrire

d.viewkeys()>=set("abc") 

Bien sûr, si les clés sont pas de caractères uniques, vous pouvez remplacer set("abc") avec set(('a', 'b', 'c'))

+0

serait gentil, mais je peux seulement utiliser python 2.4 sur notre serveur prod. – AkaBkn

+0

+1 pour l'exhaustivité si quelqu'un regarde plus tard et utilise python 2.7+ –

1

Dans la version 2.4, j'utilise toujours les opérations définies à ces fins. Si cela vaut la peine d'un avertissement (ou tout autre type de msg ou exception) lorsque certaines clés attendues manquent, en particulier, je fais:

missing = set(d).difference(('a', 'b', 'c')) 
if missing: 
    logging.warn("Missing keys: %s", ', '.join(sorted(missing))) 
else: 
    ... 

remplaçant l'appel, selon le cas logging.warn, bien sûr (peut-être juste logging.info ou même logging.debug, peut-être logging.error, peut-être une exception).

La partie sorted est pour la plupart cosmétique (j'aime les messages d'erreur fiables et reproductibles) mais aide aussi un peu à tester (quand je mock up logging.warn - ou quoi que ce soit - dans les tests, c'est bien de pouvoir attendez une chaîne spécifique, et si je n'ai pas trié le missing, la chaîne d'avertissement peut varier, bien sûr, puisque les ensembles, comme les dicts, n'ont pas de concept d'ordre).

Questions connexes