Maison  >  Article  >  développement back-end  >  Comment implémenter un defaultdict ordonné en Python pour maintenir l'ordre des clés et attribuer des valeurs par défaut ?

Comment implémenter un defaultdict ordonné en Python pour maintenir l'ordre des clés et attribuer des valeurs par défaut ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-28 09:33:02507parcourir

How do you implement an ordered defaultdict in Python to maintain key order and assign default values?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn