Python中的无限嵌套字典 [英] Infinitely Nested Dictionary in Python
问题描述
我发现自己重复这种模式:
d = defaultdict(lambda:defaultdict(lambda:defaultdict(int)))
d ['abc'] ['def'] ['xyz '] + = 1
如果我要添加另一层(例如 d ['abc'] ['def'] ['xyz'] ['wrt']
),我必须定义另一个嵌套的默认值。
为了概括这种模式,我写了一个简单的类,它覆盖 __ getitem __
以自动创建下一个嵌套字典。
例如
d = InfiniteDict(('count',0),('total',0) )
d ['abc'] ['def'] ['xyz']。count + = 0.24
d ['abc'] ['def'] ['xyz'] total + = 1
d ['abc'] ['def'] ['xyz'] ['wrt']。count + = 0.143
d ['abc'] ['def'] ['xyz'] ['wrt '] .total + = 1
但是,有没有人知道这个想法的预先实现?我试过谷歌,但我不知道这将被称为什么。
你可以从 defaultdict
以获取所需的行为:
class InfiniteDict(defaultdict):
def __init __(self):
defaultdict .__ init __(self,self .__ class__)
类计数器(InfiniteDict):
def __init __(self):
InfiniteDict .__ init __(self)
self.count = 0
self.total = 0
def show(self):
print%i out of%i %(self.count,self.total)
此类的用法如下所示: / p>
>>> d =计数器()
>>> d [1] [2] [3] .total = 5
>>>> d [1] [2] [3] .show()
0 out of 5
>>> d [5] .show()
0 out of 0
Does anyone know if there's a standard class for an infinitely nestable dictionary in Python?
I'm finding myself repeating this pattern:
d = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
d['abc']['def']['xyz'] += 1
If I want to add "another layer" (e.g. d['abc']['def']['xyz']['wrt']
), I have to define another nesting of defaultdicts.
To generalize this pattern, I've written a simple class that overrides __getitem__
to automatically create the next nested dictionary.
e.g.
d = InfiniteDict(('count',0),('total',0))
d['abc']['def']['xyz'].count += 0.24
d['abc']['def']['xyz'].total += 1
d['abc']['def']['xyz']['wrt'].count += 0.143
d['abc']['def']['xyz']['wrt'].total += 1
However, does anyone know of a pre-existing implementation of this idea? I've tried Googling, but I'm not sure what this would be called.
You can derive from defaultdict
to get the behavior you want:
class InfiniteDict(defaultdict):
def __init__(self):
defaultdict.__init__(self, self.__class__)
class Counters(InfiniteDict):
def __init__(self):
InfiniteDict.__init__(self)
self.count = 0
self.total = 0
def show(self):
print "%i out of %i" % (self.count, self.total)
Usage of this class would look like this:
>>> d = Counters()
>>> d[1][2][3].total = 5
>>> d[1][2][3].show()
0 out of 5
>>> d[5].show()
0 out of 0
这篇关于Python中的无限嵌套字典的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!