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 p> afin de ne pas en obtenir un, je voudrais saisir l'exception ou utiliser get. P> Je voudrais ne pas avoir Pour faire ça avec mon dictionnaire ... p> p>
5 Réponses :
$ 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
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 CODE> LOPS I> sur la déclaration que vous mesurez, de sorte que IT B> répète cette déclaration - dans ce cas, le pour i dans r code> boucle.
+1 Je n'ai jamais réalisé le compromis de performance / mémoire des 2 approches. Merci d'éclaircir moi.
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. P> blockQuote>
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['?'])
Voici comment sous-classe dict code> comme suggéré par NULLUSEREXCEPTION >>> print a
{'two': 2, 'one': 1}
Parfois ce que vous voulez vraiment, c'est Voici un exemple de Cela nous permettra de créer un dictionnaire comme : .setdefault () code> 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. ". setingdefault () code> étant utilisé à bon effet: p> {'Key1': [ELEM1, ELEM3], 'Keem2': [ELEM3]} CODE> 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> p>
Collections.DefaultDict code> est votre solution incluse de piles.