Home  >  Article  >  Backend Development  >  How can you combine the features of OrderedDict and defaultdict in Python to create an ordered default dict?

How can you combine the features of OrderedDict and defaultdict in Python to create an ordered default dict?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 19:02:02667browse

How can you combine the features of OrderedDict and defaultdict in Python to create an ordered default dict?

Implementing an Ordered Default Dict

OrderedDict and defaultdict are two useful data structures from the Python collections module. OrderedDict preserves the insertion order of its elements, while defaultdict provides a default value for missing keys. Combining these functionalities creates an ordered default dict.

To achieve this, we can utilize a modified version of a recipe from Stack Overflow:

<code class="python">from collections import OrderedDict, Callable

class DefaultOrderedDict(OrderedDict):
    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

    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>

This implementation supports all the features of OrderedDict and defaultdict, allowing you to create ordered dictionaries with default values for missing keys.

The above is the detailed content of How can you combine the features of OrderedDict and defaultdict in Python to create an ordered default dict?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn