Python double autoenumerated defaultdict

To optimize some code, I use the following:

a = defaultdict(lambda: len(a))
a[0] = 0
a[1] = 1
a[7] = 2
...

Now my problem is that I will need a nested defaultdict, i.e.

b = defaultdict(lambda: defaultdict(lambda: len(b[?]))
b[0][0] = 0
b[0][1] = 1
b[1][0] = 0
b[1][1] = 1
...

Thanks in advance...

+3
source share
2 answers
def enumdict():
    a = defaultdict(lambda : len(a))
    return a

b = defaultdict(enumdict)
+4
source

If you want to make it a class:

class CountDict(defaultdict):
    def __init__(self):
        defaultdict.__init__(self, self.default_factory)

    def default_factory(self):
         sub = defaultdict()
         sub.default_factory = sub.__len__
         return sub

Usually you cannot do this in lambda, because you need to assign a child default dict to a variable in order to get its len later, which is not possible in lambdas. @Duncan came up with a workaround using list comprehension to act as an assignment. Good job :) but don't use it ..: D

+1
source

All Articles