如何按platform与region分组嵌套字典列表并合并数据?
按平台与地域合并字典列表为嵌套JSON结构
需求说明
将包含platform、region字段,以及存储on_demand_price、capacity_storage_price或tier数据的data字段的字典列表,按平台+地域分组,合并同组内各类数据为指定的嵌套JSON结构。
样本输入数据
sample_data = [ {'platform': 'amazonwebservicesaws', 'region': 'useastnorthernvirginia', 'data': {'on_demand_price': {'usd': '40.00'}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastnorthernvirginia', 'data': {'on_demand_price': {'eur': '33.33'}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastnorthernvirginia', 'data': {'capacity_storage_price': {'usd': '23.00'}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastnorthernvirginia', 'data': {'capacity_storage_price': {'eur': '19.17'}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastohio', 'data': {'on_demand_price': {'usd': '40.00'}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastohio', 'data': {'on_demand_price': {'eur': '33.33'}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastohio', 'data': {'capacity_storage_price': {'usd': '23.00'}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastohio', 'data': {'capacity_storage_price': {'eur': '19.17'}}}, {'platform': 'microsoftazure', 'region': 'uksouthlondon', 'data': {'tier': {'enterprise': {'eur': '3.33', 'usd': '4.00', 'gbp': ''}}}}, {'platform': 'microsoftazure', 'region': 'uksouthlondon', 'data': {'tier': {'business-critical': {'eur': '4.50', 'usd': '5.40', 'gbp': ''}}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastnorthernvirginia', 'data': {'tier': {'standard': {'eur': '1.67', 'usd': '2.00', 'gbp': ''}}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastnorthernvirginia', 'data': {'tier': {'enterprise': {'eur': '2.50', 'usd': '3.00', 'gbp': ''}}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastnorthernvirginia', 'data': {'tier': {'business-critical': {'eur': '3.33', 'usd': '4.00', 'gbp': ''}}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastohio', 'data': {'tier': {'standard': {'eur': '1.67', 'usd': '2.00', 'gbp': ''}}}}, {'platform': 'amazonwebservicesaws', 'region': 'useastohio', 'data': {'tier': {'enterprise': {'eur': '2.50', 'usd': '3.00', 'gbp': ''}}}} ]
目标输出结构
{ "platform": { "amazonwebservicesaws": { "useastnorthernvirginia": { "on_demand_price": { "usd": "40.00", "eur": "33.33" }, "capacity_storage_price": { "usd": "23.00", "eur": "19.17" }, "tier": { "standard": { "eur": "1.67", "usd": "2.00", "gbp": "" }, "enterprise": { "eur": "2.50", "usd": "3.00", "gbp": "" }, "business-critical": { "eur": "3.33", "usd": "4.00", "gbp": "" } } }, "useastohio": { "on_demand_price": { "usd": "40.00", "eur": "33.33" }, "capacity_storage_price": { "usd": "23.00", "eur": "19.17" }, "tier": { "standard": { "eur": "1.67", "usd": "2.00", "gbp": "" }, "enterprise": { "eur": "2.50", "usd": "3.00", "gbp": "" } } } }, "microsoftazure": { "uksouthlondon": { "tier": { "enterprise": { "eur": "3.33", "usd": "4.00", "gbp": "" }, "business-critical": { "eur": "4.50", "usd": "5.40", "gbp": "" } } } } } }
实现代码
def merge_data(sample_list): result = {"platform": {}} for item in sample_list: platform = item["platform"] region = item["region"] data = item["data"] # 初始化平台层级 if platform not in result["platform"]: result["platform"][platform] = {} # 初始化地域层级 if region not in result["platform"][platform]: result["platform"][platform][region] = {} region_data = result["platform"][platform][region] # 遍历data中的键值对,合并数据 for key, value in data.items(): if key not in region_data: region_data[key] = {} # 处理价格或层级的嵌套结构 if isinstance(value, dict): # 针对on_demand_price、capacity_storage_price的货币合并 if key in ["on_demand_price", "capacity_storage_price"]: region_data[key].update(value) # 针对tier的子层级合并 elif key == "tier": tier_name = next(iter(value.keys())) if tier_name not in region_data[key]: region_data[key][tier_name] = {} region_data[key][tier_name].update(value[tier_name]) return result # 执行合并并打印结果 merged_result = merge_data(sample_data) import json print(json.dumps(merged_result, indent=2))
代码说明
- 逐层初始化
platform、region层级,避免因键不存在报错 - 针对不同类型的
data字段做差异化合并:- 对
on_demand_price和capacity_storage_price,直接合并货币键值对 - 对
tier,先提取层级名称(如standard),再合并该层级下的货币数据
- 对
- 最终用
json.dumps格式化输出嵌套结构
内容的提问来源于stack exchange,提问作者Ferron Hooi
相关产品推荐
相关产品推荐

