在Python中,是否有其他方法可以使用复杂/非结构化嵌套dict格式提取信息?

在Python中,是否有其他方法可以使用复杂/非结构化嵌套dict格式提取信息?,python,dictionary,nested,Python,Dictionary,Nested,假设我有一个非结构化嵌套dict,如下所示: { 'A_brand': {'score1': {'A': 13, 'K': 50}}, 'B_brand': {'before_taste': {'score2': {'A': 43, 'D': 23}}, 'after_taste': {'score3': {'H': 36, 'J': 34}}}, 'Score4': {'G': 2, 'W': 19} } 我如何获得/显示信息,如:每个分数中哪个字母得分最高? 比如: 我所做的是模仿我创建一

假设我有一个非结构化嵌套dict,如下所示:

{
'A_brand': {'score1': {'A': 13, 'K': 50}},
'B_brand': {'before_taste': {'score2': {'A': 43, 'D': 23}}, 'after_taste': {'score3': {'H': 36, 'J': 34}}},
'Score4': {'G': 2, 'W': 19}
}
我如何获得/显示信息,如:每个分数中哪个字母得分最高? 比如:

我所做的是模仿我创建一个新的dict并访问每个路径,按值对它们进行排序,选择第一个项目,然后将其添加到新的dict中。 例如:

new_csv={'key':'value'}

first=data['A_brand']['before_lunch_break']['score1']
first_new=sorted(first.items(),key=lambda x: x[1],reverse=True)
new_csv['A_brand/score']=first_new[0][0]

second=data['B_brand']['before_taste']['score2']
second_new=sorted(second.items(),key=lambda x: x[1],reverse=True)
new_csv['B_brand/before_taste/score2']=second_new[0][0]

...

我想知道是否有更快或自动的方法可以做到这一点?

您可以使用带递归的生成器:

data = {'A_brand': {'score1': {'A': 13, 'K': 50}}, 'B_brand': {'before_taste': {'score2': {'A': 43, 'D': 23}}, 'after_taste': {'score3': {'H': 36, 'J': 34}}}, 'Score4': {'G': 2, 'W': 19}}
def get_max(d, c = []):
   for a, b in d.items():
     if all(not isinstance(i, dict) for i in b.values()): 
        yield ('/'.join(c+[a]), max(b, key=lambda x:b[x]))
     else:
        yield from get_max(b, c+[a])

print(dict(get_max(data)))
输出:

{'A_brand/score1': 'K', 'B_brand/before_taste/score2': 'A', 'B_brand/after_taste/score3': 'H', 'Score4': 'W'}

我可以问一下在开始时设置(d,c=[])的目的是什么吗?
c=[]
get_max
的默认参数。如果调用后者时没有显式传递
c
的值,则
c
默认为最初指定的值。在这种情况下,它使调用
dict(get_max(data))
dict(get_max(data,[]))更干净一些。
{'A_brand/score1': 'K', 'B_brand/before_taste/score2': 'A', 'B_brand/after_taste/score3': 'H', 'Score4': 'W'}