9
votes

Un dictionnaire pardonnant

Je me demande comment créer un dictionnaire pardonnant (un qui renvoie une valeur par défaut si un keyError est soulevé).

Dans l'exemple de code suivant, je voudrais obtenir un keillerror; par exemple xxx

afin de ne pas en obtenir un, je voudrais saisir l'exception ou utiliser get.

Je voudrais ne pas avoir Pour faire ça avec mon dictionnaire ...


1 commentaires

Collections.DefaultDict est votre solution incluse de piles.


5 Réponses :


22
votes
$ python -mtimeit -s'import collections; a=collections.defaultdict(int); r=xrange(99)' 'for i in r: _=a[i]'
100000 loops, best of 3: 14.9 usec per loop

$ python -mtimeit -s'class mydict(dict):
>   def __missing__(self, key): return 0
> ' -s'a=mydict(); r=xrange(99)' 'for i in r: _=a[i]'
10000 loops, best of 3: 92.9 usec per loop

4 commentaires

AVERTISSEMENT: DefaultDict Insertion d'un nouvel élément en soi chaque fois qu'elle renvoie la valeur par défaut d'une clé donnée. Cela transforme les opérations de lecture en opérations d'écriture potentielles et signifie que la recherche de beaucoup de clés manquantes le fera grandir rapidement. docs.python.org/library/...


Excellent post! Votre deuxième au dernier paragraphe ne semble pas se rapporter à votre exemple puisque vous n'utilisez jamais la même clé deux fois. Il semble donc que ledit de défaillance soit plus rapide même si vous ne répétez jamais une clé et même plus rapidement si vous le faites. Est-ce correct?


@Jeff, TIMIIT LOPS sur la déclaration que vous mesurez, de sorte que IT répète cette déclaration - dans ce cas, le pour i dans r boucle.


+1 Je n'ai jamais réalisé le compromis de performance / mémoire des 2 approches. Merci d'éclaircir moi.



7
votes

Nouveau dans la version 2.5: Si une sous-classe de dict définit une méthode __Missing __ (), Si la clé de clé n'est pas présente, le D [clé] L'opération appelle cette méthode avec la clé clé comme argument. Les d [clé] opération puis retourne ou lève ce qui est retourné ou élevé par l'appel __Missing __ (clé) si le La clé n'est pas présente. Aucun autre Opérations ou méthodes invoquées __disparu__(). Si __ __Missing __ () n'est pas défini, KeyError est soulevé. __Missing __ () doit être une méthode; Il ne peut pas être une variable d'instance. Pour un Exemple, voir Collections.DefaultDict.

http://docs.python.org/library/stdtypes.html


0 commentaires

3
votes

Vous voudrez probablement utiliser un titre de défaut (il nécessite au moins python2.5, je crois)

from collections import defaultdict
def default(): return 'Default Value'
d = defaultdict(default)
print(d['?'])


0 commentaires

6
votes

Voici comment sous-classe dict code> comme suggéré par NULLUSEREXCEPTION

>>> print a
{'two': 2, 'one': 1}


0 commentaires

0
votes

Parfois ce que vous voulez vraiment, c'est .setdefault () qui n'est pas très intuitif, mais c'est une méthode qui "renvoie la clé spécifiée, si elle n'existe pas, définissez cette touche sur cette valeur. ".

Voici un exemple de setingdefault () étant utilisé à bon effet: xxx

Cela nous permettra de créer un dictionnaire comme : {'Key1': [ELEM1, ELEM3], 'Keem2': [ELEM3]} Sans avoir à avoir une vérification laideuse pour voir s'il y a une clé déjà là et crée une liste pour cela. < / p>


0 commentaires