creating a defaultlist in python

前端 未结 2 1915
眼角桃花
眼角桃花 2020-12-01 16:22

I\'m trying to create a list equivalent for the very useful collections.defaultdict. The following design works nicely:

class defaultlist(list):
    def __in         


        
相关标签:
2条回答
  • 2020-12-01 17:15

    On the example you give, you first try to retrieve a non-existing value on the list, as you do dl[2]['a'], Python first retrieve the third (index 2) element on the list, then proceed to get the element named 'a' on that object - therefore you have to implement your automatic extending behavior to the __getitem__ method as well, like this:

    class defaultlist(list):
        def __init__(self, fx):
            self._fx = fx
        def _fill(self, index):
            while len(self) <= index:
                self.append(self._fx())
        def __setitem__(self, index, value):
            self._fill(index)
            list.__setitem__(self, index, value)
        def __getitem__(self, index):
            self._fill(index)
            return list.__getitem__(self, index)
    
    0 讨论(0)
  • 2020-12-01 17:25

    There is a python package available:

    $ pip install defaultlist
    

    Added indicies are filled with None by default.

    >>> from defaultlist import defaultlist
    >>> l = defaultlist()
    >>> l
    []
    >>> l[2] = "C"
    >>> l
    [None, None, 'C']
    >>> l[4]
    >>> l
    [None, None, 'C', None, None]
    

    Slices and negative indicies are supported likewise

    >>> l[1:4]
    [None, 'C', None]
    >>> l[-3]
    'C'
    

    Simple factory functions can be created via lambda.

    >>> l = defaultlist(lambda: 'empty')
    >>> l[2] = "C"
    >>> l[4]
    'empty'
    >>> l
    ['empty', 'empty', 'C', 'empty', 'empty']
    

    It is also possible to implement advanced factory functions:

    >>> def inc():
    ...     inc.counter += 1
    ...     return inc.counter
    >>> inc.counter = -1
    >>> l = defaultlist(inc)
    >>> l[2] = "C"
    >>> l
    [0, 1, 'C']
    >>> l[4]
    4
    >>> l
    [0, 1, 'C', 3, 4]
    

    See the Documentation for any further details.

    0 讨论(0)
提交回复
热议问题