python - 使用递归来反转 python 中围绕值的字典

标签 python algorithm recursion

我有一个遵循以下示例结构的数据集:

exampleset = {
    'body' : {
        'abdomen' : [{
            'arms' : {
                'value' : 2,
            }
        },{
            'legs': {
                'value' : 2,
            }
        }],
        'hands' : {
            'fingers' : {
                'value' : 5,
            }
        },
    }                
}

我正试图扭转这一点,所以我得到类似的东西:

{'value': {'value1': {5: {'fingers': {'hands': {'body': {}}}}},
           'value2': {2: {'legs': {'abdomen': {'body': {}}}}},
           'value3': {2: {'arms': {'abdomen': {'body': {}}}}}},
}

(我希望我的括号匹配正确,但你明白了。)

我正在使用几个递归函数来执行此操作,如下所示:

def recurse_find(data, values, count):
    global conf
    for key in data:
        for v in conf['value_names']:
            if key == v:
                values[v+str(count)] = {}
                values[v+str(count)][data[key]] = {}
                count += 1
                # originally just using this line:
                # values[data[key]] = {}
        if type(data[key]) is list:
            for i in data[key]:
                if type(i) is dict:
                    values = recurse_find(i, values, count)
                    values = add_new_level(values, key)
        elif type(data[key]) is dict:
            values = recurse_find(data[key], values, count)
            values = add_new_level(values, key)
    return values

def add_new_level(data, new_key):
    for key in data:
        if data[key] == {}:
            data[key][new_key] = {}
        else:
            data[key] = add_new_level(data[key], new_key)
    return data

conf = { "value_names": ["value"] }

for value in conf['value_names']:
    values[value] = recurse_find(exampleset, {}, 1)

print(values)

目前我只正确返回了一个值,显然我想要所有的值。最初我没有标记值(值 1、值 2 等),但是在做这个示例集时我意识到,当然如果值相同我只会得到一个!如果我删除值名称键,它会找到所有值(除非重复)但仍然不会返回正确的级别,因为它在循环时包含其他一些值。我不关心值的顺序,只关心它们的标记不同,这样我就不会遗漏任何值。

当前结果:

{'value': {'value1': {5: {'fingers': {'hands': {'body': {}}}}}}}

我认为解决方案是包含一个非常简单的步骤,但我目前看不到它,而且我已经花了太长时间研究它。 任何帮助表示赞赏。

编辑:

通过更改我的递归函数使 count 成为全局变量并在函数外部设置 count=1 ,我已经取得了一些进展,这解决了获取所有问题的问题值(value)观问题。

我已经缩小了向 add_new_level 函数添加额外键的范围,但还没有想出如何更改它。

输出:

{'value': {'value1': {2: {'arms': {'abdomen': {'legs': {'abdomen': {'fingers': {'hands': {'body': {}}}}}}}}},
           'value2': {2: {'legs': {'abdomen': {'fingers': {'hands': {'body': {}}}}}}},
           'value3': {5: {'fingers': {'hands': {'body': {}}}}}}}

最佳答案

我稍微调整了您的输出类型,使包含“value1”、“value2”等的字典成为一个数组。我相信这更好,因为除非使用 OrderedDict(来自 collections 包),否则这些顺序无论如何都会丢失,并且在任何情况下,数组都会很容易地从索引 0,1,2,3.. 转换为 val1,val2, val3 等...

res = {'value': []}
def revnest(inp, keys=[]):
    res2 = res['value']
    if type(inp) == list:
        inp = {i:j[i] for j in inp for i in j}
    for x in inp:
        if x == 'value':
            res2.append({inp[x]:{}})
            res2 = res2[-1][inp[x]]
            for y in keys[::-1]:
                res2[y] = {}
                res2 = res2[y]
        else:
            revnest(inp[x], keys+[x])

revnest(exampleset)
print res

给定您的示例集,打印:

{'value': [{2: {'legs': {'abdomen': {'body': {}}}}}, {2: {'arms': {'abdomen': {'body': {}}}}}, {5: {'fingers': {'hands': {'body': {}}}}}]}

关于python - 使用递归来反转 python 中围绕值的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35627441/

相关文章:

c++ - 使用递归从子集总和中找到最大总和

python - 使用 lambda 的递归函数,为什么这不起作用?

python - 图表数据,网站浏览量用什么平台

python - Pocket API 访问 token 请求

c - 找到突变最多的最长回文 DNA 子序列

c++ - 递归 C++ 函数中 if 与 while 的行为

python - 根据其他列更改数据框中每一行的列

python - 配置 Django

arrays - 给定三个等长数组,我如何找到可能的组合数量,其中我以递增的方式从每个数组中选择一个整数

algorithm - 计算旋转矩形中的最大内接矩形