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
Libérer: 2024-10-28 09:33:02
original
521 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!