我有一个遵循以下示例结构的数据集:
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/