Python 在任何嵌套级别解析并获取最高属性值

Python parse at any nested level and get highest attribute value

我有一项任务,我已经尝试解决这个问题好几个小时了,但无济于事。纸质记录可以嵌套在字典的任何层级

我正在尝试解析 yaml 文件并获取输出的嵌套值

sales                      highest_sales
sales.yml/sales1/paper1       Dwight

到目前为止,我只能从我的代码中获取键和值对,但我已经去了任何地方。谁能想一想

这是 YAML 文件的输出

{'sales1': {'paper1': {'Jim': 8, 'Pam': 9, 'Dwight': 43}}, 'sales2': {'morning_sales': {'paper2': {'Jim': 10, 'Pam': 23, 'Dwight': 67, 'Michael': 12}}, 'evening_sales': {'paper3': {'Jim': 3, 'Pam': 43, 'Dwight': 67}}}, 'paper4': {'Jim': 23, 'Pam': 14, 'Dwight': 8}}
import yaml

with open(r"C:\Users\Jason\Assignments\Assignment8\sales.yml", 'r') as yamlfile:
        data = yaml.load(yamlfile, Loader=yaml.FullLoader)  


def iterdict(d):
  for k,v in d.items():        
     if isinstance(v, dict):
         iterdict(v)
     else:            
         print (k,":",v)

iterdict(data)

可以使用 operator.itemgetter Documentation 找到最大值的键
你可以试试这个代码,它应该可以工作

import yaml
import operator

def check_max(k, v, prev_key):
    try:
        # To get key of maximum sale
        sales = max(v.items(), key=operator.itemgetter(1))[0]
        if 'sales' in sales or 'paper' in sales:
            # To check if value is another dictionary
            raise Exception("value is a dictionary")
        print("{:38s} {:10s}".format(str(prev_key)+'/'+str(k),sales))

    except:
        # The value was a dictionary 
        for k1, v1 in v.items():
            check_max(k1,v1, prev_key+'/'+str(k))


with open(r"C:\Users\Jason\Assignments\Assignment8\sales.yml", 'r') as yamlfile:
        data = yaml.load(yamlfile, Loader=yaml.FullLoader)  

# Formatting of data you can 
# increase the value for proper formatting
print("{:38s} {:10s}".format("sales","highest_sales"))
for k,v in data.items():
    check_max(k,v, 'sales.yml')

输出:

sales                                  highest_sales
sales.yml/sales1/paper1                Dwight
sales.yml/sales2/morning_sales/paper2  Dwight
sales.yml/sales2/evening_sales/paper3  Dwight
sales.yml/paper4                       Jim