Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将嵌套Dict中的两个键/值上移一级_Python_Arrays_List_Dictionary_Nested - Fatal编程技术网

如何在Python中将嵌套Dict中的两个键/值上移一级

如何在Python中将嵌套Dict中的两个键/值上移一级,python,arrays,list,dictionary,nested,Python,Arrays,List,Dictionary,Nested,昨天,我遇到了一个问题,我在这里提到了重新构建一个目录列表的问题,以防它对其他有类似问题的人有所帮助: 然而,我省略了数据中一个看起来很关键的部分。起初,我认为以后添加额外的字典键会很容易,但事实证明,这种结构很麻烦。因此,我想出了以下方法,接近我所需要的 本质上,我希望将两个键“selection_id”和“other_data”向上移动一个级别,并完全替换“market_data”字典,请参见下面的理想数据结构 我想我可以找到一种使用setattr的方法,但在使用嵌套字典的循环中,这似乎是有

昨天,我遇到了一个问题,我在这里提到了重新构建一个目录列表的问题,以防它对其他有类似问题的人有所帮助:

然而,我省略了数据中一个看起来很关键的部分。起初,我认为以后添加额外的字典键会很容易,但事实证明,这种结构很麻烦。因此,我想出了以下方法,接近我所需要的

本质上,我希望将两个键“selection_id”和“other_data”向上移动一个级别,并完全替换“market_data”字典,请参见下面的理想数据结构

我想我可以找到一种使用setattr的方法,但在使用嵌套字典的循环中,这似乎是有问题的。此外,我甚至不确定这是一种合适的方式,因为我会提前收到所有数据,只是格式不对

我的示例代码非常接近,如下所示:

market=[{'selection_id': 1099,'value':'11', 'value_name': 'a', 'other_data': 89},  
{'selection_id': 1099,'value':'78', 'value_name': 'p', 'other_data': 89},  
{'selection_id': 1097,'value':'39', 'value_name': 'b', 'other_data': 89},  
{'selection_id': 1097,'value':'52', 'value_name': 'f', 'other_data': 89},  
{'selection_id': 1098,'value':'98', 'value_name': 'd', 'other_data': 89},  
{'selection_id': 1099,'value':'13', 'value_name': 'y', 'other_data': 89},  
{'selection_id': 1098,'value':'4', 'value_name': 'r', 'other_data': 89},
]

new_structure = {}  

new_structure2 = []  


for z in market:
        new_structure.setdefault((z['selection_id'], z['other_data']), []).append({'value': z['value'], 'value_name': z['value_name']})
new_structure2.append([{'market_data': m, 'value_dict': n} for m, n in new_structure.items()])

for s in new_structure2:
    for t in s:
        dict = {}
        dict['selection_id'] = t['market_data'][0]
        dict['other_data'] = t['market_data'][1]
        t['market_data'] = dict

print(new_structure2)

上述代码产生以下结果:

[[{'market_data':  
{'selection_id': 1099, 'other_data': 89}, 'value_dict':  
[{'value': '11', 'value_name': 'a'}, {'value': '78', 'value_name': 'p'}, {'value': '13', 'value_name': 'y'}]},  
{'market_data':  
{'selection_id': 1097, 'other_data': 89}, 'value_dict':  
[{'value': '39', 'value_name': 'b'}, {'value': '52', 'value_name': 'f'}]}, {'market_data':  
{'selection_id': 1098, 'other_data': 89}, 'value_dict':  
[{'value': '98', 'value_name': 'd'}, {'value': '4', 'value_name': 'r'}]}]]

而我想要的是:

[{'selection_id': 1099, 'other_data': 89, 'value_dict':  
[{'value': '11', 'value_name': 'a'}, {'value': '78', 'value_name': 'p'}, {'value': '13', 'value_name': 'y'}]},  
{'selection_id': 1097, 'other_data': 89, 'value_dict':  
[{'value': '39', 'value_name': 'b'}, {'value': '52', 'value_name': 'f'}]},  
{'selection_id': 1098, 'other_data': 89, 'value_dict':  
[{'value': '98', 'value_name': 'd'}, {'value': '4', 'value_name': 'r'}]}]

为避免疑义,“其他数据”对于任何给定的“选择id”都将始终相同,即,如果有两个“选择id”=1099的实例,那么“其他数据”将始终等于89,在示例中,它们都是89,但对于实际中的不同选择id可能不同。

这是一种方法

例:

输出:


谢谢,使用我的测试数据,我能够完全复制您在这里拥有的数据…但是,使用我获得的实际数据,即动态数据,我在listresult.values创建另一个列表时遇到了一个问题,这与我需要如何传递数据无关。实际上,我只需要results.values,但如果前面没有list函数,那么它就不起作用,我会将它附加到一个已经存在的列表中。有没有一种方法可以在不首先添加额外列表的情况下以某种方式附加到列表中?破译调试有点棘手,但我认为相关的错误是:TypeError:dict_值类型的对象如果我不使用list,就不能JSON序列化。实际上,我可以使用extend而不是append来考虑它!尽管看起来我的数据结构是错误的,所以可能需要重新思考,但是在您的帮助下,这将更容易,非常感谢!我设法适应了我的生活环境,这最终只是一个简单的调整,但在这里发布毫无意义,因为它与我发布的原始数据集无关,已经标记为已回答。
market=[{'selection_id': 1099,'value':'11', 'value_name': 'a', 'other_data': 89},  
{'selection_id': 1099,'value':'78', 'value_name': 'p', 'other_data': 89},  
{'selection_id': 1097,'value':'39', 'value_name': 'b', 'other_data': 89},  
{'selection_id': 1097,'value':'52', 'value_name': 'f', 'other_data': 89},  
{'selection_id': 1098,'value':'98', 'value_name': 'd', 'other_data': 89},  
{'selection_id': 1099,'value':'13', 'value_name': 'y', 'other_data': 89},  
{'selection_id': 1098,'value':'4', 'value_name': 'r', 'other_data': 89},
]

result = {}
for i in market:
    if i["selection_id"] not in result:
        result[i["selection_id"]] = {'selection_id': i["selection_id"], 'other_data': i["other_data"], 'value_dict': []}
    result[i["selection_id"]]["value_dict"].append({'value': i["value"], "value_name": i["value_name"]})


print(list(result.values()))
[{'other_data': 89,
  'selection_id': 1097,
  'value_dict': [{'value': '39', 'value_name': 'b'},
                 {'value': '52', 'value_name': 'f'}]},
 {'other_data': 89,
  'selection_id': 1098,
  'value_dict': [{'value': '98', 'value_name': 'd'},
                 {'value': '4', 'value_name': 'r'}]},
 {'other_data': 89,
  'selection_id': 1099,
  'value_dict': [{'value': '11', 'value_name': 'a'},
                 {'value': '78', 'value_name': 'p'},
                 {'value': '13', 'value_name': 'y'}]}]