如何在Python中删除嵌套字典结构中的顶层



我有一个嵌套的字典,看起来像下面,

{
'product_list.show_date': "May '21",
'product_list.new_users': 
{
'product_list.product': 
{
'A': None,
'B': 377,
'C': None,
'D': 67,
'E': None,
'F': 1,
'G': None
}
}
}

我想把它清除掉这样父键就不存在了。基本上,我想要一个没有嵌套的字典。像下面,

{
'product_list.show_date': "May '21",
'A': None,
'B': 377,
'C': None,
'D': 67,
'E': None,
'F': 1,
'G': None
}

我使用递归函数来做这件事,但它不是100%正确的。

这是我的代码,

def clear_nd(d, nested_dict):
for key in nested_dict:
if type(nested_dict[key]) != dict:
d[key] = nested_dict[key]
elif type(nested_dict[key]) == dict:
nested_dict = nested_dict[key]
clear_nd(d, nested_dict)

return d
d = {}
clear_nd(d, nested_dict)

nested_dict = {
'product_list.show_date': "May '21",
'product_list.new_users': {
'product_list.product': {
'A': None,
'B': 377,
'C': None,
'D': 67,
'E': None,
'F': 1,
'G': None
},
'prod.product': {
'Alk': None,
'Bay': 377,
'Lent': None,
'R': 67,
'Ter': None,
'Wi': 1,
'e': None
}
},
'duct_list.new_users': {
'pdust.product': {
'H': None,
'y': 377,
'nt': None,
'C': 67,
'sfer': None,
's': 1,
'le': None
}
}
}

是否Pandas或任何其他库有办法做到这一点。嵌套字典的结构是动态的,所以我们不知道它有多深。键也会改变,所以我们无法事先知道字典中的键是什么。任何帮助都将不胜感激。谢谢! !

如果允许较低级别的标记标签采用较高级标记标签的前缀,则可以使用Pandas函数pandas.json_normalize,该函数处理嵌套字典并将其转换为平面表Pandas数据框架。

然后,使用pandas.DataFrame.to_dict将Pandas数据框转换为字典。例如,

import pandas as pd
d = {
'product_list.show_date': "May '21",
'product_list.new_users': 
{
'product_list.product': 
{
'A': None,
'B': 377,
'C': None,
'D': 67,
'E': None,
'F': 1,
'G': None
}
}
}

pd.json_normalize(d).to_dict('records')[0]

结果:

{'product_list.show_date': "May '21",
'product_list.new_users.product_list.product.A': None,
'product_list.new_users.product_list.product.B': 377,
'product_list.new_users.product_list.product.C': None,
'product_list.new_users.product_list.product.D': 67,
'product_list.new_users.product_list.product.E': None,
'product_list.new_users.product_list.product.F': 1,
'product_list.new_users.product_list.product.G': None}

最新更新