defaultdict
est génial lorsque la valeur par défaut est statique, comme une nouvelle liste, mais pas tellement si elle est dynamique.
Par exemple, j'ai besoin d'un dictionnaire pour mapper les chaînes de caractères sur des entiers uniques. defaultdict(int)
utilisera toujours 0 comme valeur par défaut. De même, defaultdict(intGen())
produit toujours 1.
À la place, j'ai utilisé un dictionnaire régulier :
nextID = intGen()
myDict = {}
pour beaucoup de choses compliquées :
# choses qui génèrent des chaînes de caractères imprévisibles, peut-être déjà vues
strID = myDict.setdefault(myStr, nextID())
Notez que dict.get(key, nextID())
est insuffisant car j'ai besoin de pouvoir référer à ces valeurs plus tard également.
intGen
est une petite classe que j'ai créée qui incrémente automatiquement un entier et renvoie sa valeur :
class intGen:
def __init__(self):
self.i = 0
def __call__(self):
self.i += 1
return self.i
Si quelqu'un a une manière de faire cela avec defaultdict
, j'adorerais le voir.