Maison >développement back-end >Tutoriel Python >Comment implémenter un defaultdict ordonné en Python pour maintenir l'ordre des clés et attribuer des valeurs par défaut ?
Implémentation d'un dict par défaut ordonné
On pourrait vouloir fusionner les fonctionnalités de OrderedDict() et defaultdict() du module Python Collections pour créer un dict par défaut ordonné. Cette combinaison permettrait de conserver un dictionnaire dans lequel les clés sont ordonnées et des valeurs par défaut sont attribuées lors de l'accès à des clés inexistantes.
Pour y parvenir, nous pouvons utiliser une version modifiée d'une recette fournie dans la communauté Stack Overflow. Voici le code :
<code class="python">from collections import OrderedDict, Callable class DefaultOrderedDict(OrderedDict): # Source: http://stackoverflow.com/a/6190500/562769 def __init__(self, default_factory=None, *a, **kw): if (default_factory is not None and not isinstance(default_factory, Callable)): raise TypeError('first argument must be callable') OrderedDict.__init__(self, *a, **kw) self.default_factory = default_factory def __getitem__(self, key): try: return OrderedDict.__getitem__(self, key) except KeyError: return self.__missing__(key) def __missing__(self, key): if self.default_factory is None: raise KeyError(key) self[key] = value = self.default_factory() return value # Override necessary methods for pickling def __reduce__(self): if self.default_factory is None: args = tuple() else: args = self.default_factory, return type(self), args, None, None, self.items() def copy(self): return self.__copy__() def __copy__(self): return type(self)(self.default_factory, self) def __deepcopy__(self, memo): import copy return type(self)(self.default_factory, copy.deepcopy(self.items())) def __repr__(self): return 'OrderedDefaultDict(%s, %s)' % (self.default_factory, OrderedDict.__repr__(self))</code>
Cet extrait de code intègre une méthode __init__, vous permettant de spécifier une fonction d'usine par défaut. La méthode __missing__ gère l'accès aux clés et attribue des valeurs par défaut à l'aide de la fonction d'usine. De plus, diverses méthodes telles que __reduce__, copy(), __copy__(), __deepcopy__() et __repr__() sont définies pour un décapage et une représentation appropriés de ce dictionnaire personnalisé.
En utilisant cette classe DefaultOrderedDict, vous pouvez construire un dictionnaire ordonné qui fournit des valeurs par défaut pour les clés manquantes. Cette approche combine les avantages d'une gestion ordonnée des clés et d'une attribution de valeur dynamique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!