这是我的字形:
{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))}}
非常感谢!
答案 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
你可以通过摆脱一些中间步骤,使用defaultdict
或setdefault
方法而不是in
检查来缩小这一点,但我会离开那些作为读者的练习。
作为一个更好的改进,如果您需要多次执行此操作,您可以概括为适用于任何多级字典的swap_levels(olddict, level1=0, level2=1)
函数,因此您可以将其写为:
newdict = swap_levels(olddict)