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