Python:重新命令dict的dict

时间:2014-11-19 19:47:47

标签: python list dictionary

这是我的字形:

{frame:{point:Vector}}

我需要重新构建/订购它以获得类似的结果:

{point:{frame:Vector}}

以下是代码示例:

{1: {'pt0': Vector((0.09608151018619537, 0.1202411875128746)),
     'pt1': Vector((0.3969220519065857, 0.2085522711277008)),
     'pt2': Vector((0.3969220519065857, 0.7914475202560425)),
     'pt3': Vector((0.09608148038387299, 0.8797586560249329))},
 2: {'pt0': Vector((0.09217172116041183, 0.1268879920244217)),
     'pt1': Vector((0.4093528687953949, 0.20748035609722137)),
     'pt2': Vector((0.4093528687953949, 0.7925194501876831)),
     'pt3': Vector((0.09217172116041183, 0.8731117844581604))}}

这就是我需要的东西(矢量值不好,用手打字......):

{'pt0': {1: Vector((0.09608151018619537, 0.1202411875128746)),
         2: Vector((0.09217172116041183, 0.1268879920244217))},
 'pt1': {1: Vector((0.3969220519065857, 0.2085522711277008)),
         2: Vector((0.4093528687953949, 0.20748035609722137))},
 'pt2': {1: Vector((0.09608151018619537, 0.1202411875128746)),
         2: Vector((0.09217172116041183, 0.1268879920244217))},
 'pt3': {1: Vector((0.09608151018619537, 0.1202411875128746)),
         2: Vector((0.09217172116041183, 0.1268879920244217))}}

非常感谢!

1 个答案:

答案 0 :(得分:0)

用英语术语想想你要做的循环:

对于每个帧,对于每个点,找到新dict中的点,然后在其下添加帧。

要将其转换为Python,我们需要添加一些细节:提前创建新的dict,如果“find”找不到它,则创建该点的子dict。但除此之外,这是一个微不足道的翻译:

newdict = {}
for frame, pointsvectors in olddict.items():
    for point, vector in pointsvectors.items():
        if point not in newdict:
            newdict[point] = {}
        framesvectors = newdict[point]
        framesvectors[frame] = vector

你可以通过摆脱一些中间步骤,使用defaultdictsetdefault方法而不是in检查来缩小这一点,但我会离开那些作为读者的练习。

作为一个更好的改进,如果您需要多次执行此操作,您可以概括为适用于任何多级字典的swap_levels(olddict, level1=0, level2=1)函数,因此您可以将其写为:

newdict = swap_levels(olddict)