我有一个类似于此的元组列表(在这里简化,这些元组中有超过14,000个,其路径比Obj.part更复杂)
[ (Obj1.part1, {<SPEC>}), (Obj1.partN, {<SPEC>}), (ObjK.partN, {<SPEC>}) ]
Obj从1 - 1000开始,部分从0到2000.这些“键”都有一个与它们相关的规范字典,它们用作检查另一个二进制文件的查找参考。规范dict包含诸如位偏移,位大小和路径ObjK.partN指向的数据的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类,可以使用点符号进行字典获取/设置。该课程如下:
class dotdict(dict):
def __getattr__(self, attr):
return self.get(attr, None)
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
创建嵌套“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
指向规范。
有更好的(更加pythonic)的方法吗?
答案 0 :(得分:7)
除非您更喜欢使用点表示法访问规范,否则请尝试将它们直接放入字典中。在下面的代码中,名称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
如果每个路径只有两个部分(ObjN
和partN
说),您可以这样做:
specs = {}
for path, spec in paths:
[obj, part] = path.split('.')
specs.setdefault(obj, {})[part] = spec