在Python中,是否有其他方法可以使用复杂/非结构化嵌套dict格式提取信息?
假设我有一个非结构化嵌套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} } 我如何获得/显示信息,如:每个分数中哪个字母得分最高? 比如: 我所做的是模仿我创建一
{
'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'}