Python:从路径列表创建嵌套字典

2024-04-29 04:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个与此类似的元组列表(这里简化了,其中有超过14000个元组的路径比目标部分)在

[ (Obj1.part1, {<SPEC>}), (Obj1.partN, {<SPEC>}), (ObjK.partN, {<SPEC>}) ]

其中Obj从1到1000,部分从0到2000。这些“键”都有一个与它们相关联的规范字典,作为检查另一个二进制文件的查找引用。specs dict包含诸如位偏移量、位大小和路径所指向的数据的C类型等信息对象. 在

例如:Obj4.part500可能有这样的规范{'size':32,'offset':128,'type':'int'}这让我知道要访问二进制文件中的Obj4.part500,我必须从偏移量128中解压32位。在

所以,现在我想用我的字符串列表创建一个嵌套字典,在简化的情况下,它看起来像这样

data = { 'Obj1' : {'part1':{spec}, 'partN':{spec} }, 
         'ObjK' : {'part1':{spec}, 'partN':{spec} }
       }

为了做到这一点,我目前正在做两件事,1。我正在使用一个dotdict类,以便能够对dictionary get/set使用点表示法。那堂课是这样的:

^{pr2}$

创建嵌套的“dotdict”的方法如下所示:

def addPath(self, spec, parts, base):
    if len(parts) > 1:
        item = base.setdefault(parts[0], dotdict())
        self.addPath(spec, parts[1:], item)
    else:
        item = base.setdefault(parts[0], spec)
    return base

然后我就做一些类似的事情:

for path, spec in paths:
    self.lookup = dotdict()
    self.addPath(spec, path.split("."), self.lookup)

所以,最后
self.lookup.Obj4.part500指向规范

有没有更好的(更像Python)的方法?在


Tags: self规范baselookupitempartsspecpart1
1条回答
网友
1楼 · 发布于 2024-04-29 04:22:32

除非你喜欢用点表示法访问规范,否则试着直接把它们放到字典中。在下面的代码中,名称d跟踪路径上访问的最里面的字典:

specs = {}
for path, spec in paths:
    parts = path.split('.')
    d = specs
    for p in parts[:-1]:
        d = d.setdefault(p, {})
    d[parts[-1]] = spec

如果每个路径只有两个部分(ObjNpartN),那么可以这样做:

^{pr2}$

相关问题 更多 >