Python: 重新排序字典的顺序

2024-09-27 07:35:52 发布

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

这是我的口述表:

{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))}}

非常感谢!你知道吗


Tags: 代码示例framepoint手工vector口述量值
1条回答
网友
1楼 · 发布于 2024-09-27 07:35:52

想想你会做的循环,用英语来说:

对于每个帧,对于每个点,在新的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)

相关问题 更多 >

    热门问题