65 votes

Comment créer un dictionnaire python qui renvoie la clé pour les clés manquantes dans le dictionnaire au lieu de lever KeyError ?

Je souhaite créer un dictionnaire python qui me renvoie la valeur clé pour les clés manquantes dans le dictionnaire.

Exemple d'utilisation :

 dic = smart_dict()
dic['a'] = 'one a'
print(dic['a'])
# >>> one a
print(dic['b'])
# >>> b

90voto

Jochen Ritzel Points 42916

dict ont un __missing__ pour cela :

 class smart_dict(dict):
    def __missing__(self, key):
        return key

35voto

Daren Thomas Points 26812

Pourquoi n'utilisez-vous pas simplement

 dic.get('b', 'b')

Bien sûr, vous pouvez sous-classer dict comme d'autres le soulignent, mais je trouve pratique de me rappeler de temps en temps que get peut avoir une valeur par défaut !

Si vous voulez defaultdict , essayez ceci :

 dic = defaultdict()
dic.__missing__ = lambda key: key
dic['b'] # should set dic['b'] to 'b' and return 'b'

sauf... eh bien : AttributeError: ^collections.defaultdict^object attribute '__missing__' is read-only , vous devrez donc sous-classer :

 from collections import defaultdict
class KeyDict(defaultdict):
    def __missing__(self, key):
        return key

d = KeyDict()
print d['b'] #prints 'b'
print d.keys() #prints []

13voto

Raymond Hettinger Points 231

Le premier répondant a mentionné defaultdict , mais vous pouvez définir __missing__ pour n'importe quelle sous-classe de dict :

 >>> class Dict(dict):
        def __missing__(self, key):
            return key


>>> d = Dict(a=1, b=2)
>>> d['a']
1
>>> d['z']
'z'

De plus, j'aime l'approche du deuxième répondant :

 >>> d = dict(a=1, b=2)
>>> d.get('z', 'z')
'z'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X