如何用Python基于给定列表生成指定结构的目标数据集?
数据结构转换实现方案
问题背景
现有两组数据:
categories = ['fruits', 'meats']
only_on2 = [ { "earth": [ {"code": 1, "cats_name": 'fruits', "name": "apple"}, {"code": 2, "cats_name": 'meats', "name": "beef"}, {"code": 7, "cats_name": 'meats', "name": "chicken"} ], "sky": [ {"code": 3, "cats_name": 'fruits', "name": "apple"}, {"code": 4, "cats_name": 'meats', "name": "chicken"} ] } ]
需要将其转换为如下指定结构:
result_desired = [ { "name_place": "earth", "data": { "fruits": {"UNIT #": [1], "Name": ["apple"]}, "meats": {"UNIT #": [2,7], "Name": ["beef", "chicken"]} } }, { "name_place": "sky", "data": { "fruits": {"UNIT #": [3], "Name": ["apple"]}, "meats": {"UNIT #": [4], "Name": ['chicken']} } } ]
尝试的列表推导式未成功:
results = {place: {cat: { 'UNIT #': [item1 for key, value in only_on2 if item1['cats_name'] == cat for item1 in value], } for cat in categories} for place in only_on2}
问题分析
原推导式存在三个核心问题:
only_on2是包含单个字典的列表,直接遍历only_on2拿到的是整个字典,而非earth、sky这类地点键名;- 嵌套推导式的循环顺序错误,应先遍历条目再判断分类,原代码顺序颠倒;
- 只处理了
UNIT #字段,遗漏了Name字段的提取。
解决方案
方案一:分步循环实现(可读性强)
categories = ['fruits', 'meats'] only_on2 = [ { "earth": [ {"code": 1, "cats_name": 'fruits', "name": "apple"}, {"code": 2, "cats_name": 'meats', "name": "beef"}, {"code": 7, "cats_name": 'meats', "name": "chicken"} ], "sky": [ {"code": 3, "cats_name": 'fruits', "name": "apple"}, {"code": 4, "cats_name": 'meats', "name": "chicken"} ] } ] # 取出only_on2中存储的地点数据字典 place_dict = only_on2[0] result = [] # 遍历每个地点及其条目 for place_name, items in place_dict.items(): category_info = {} # 按指定分类整理数据 for cat in categories: filtered_items = [item for item in items if item['cats_name'] == cat] category_info[cat] = { "UNIT #": [item['code'] for item in filtered_items], "Name": [item['name'] for item in filtered_items] } # 组装单个地点的结果并加入列表 result.append({ "name_place": place_name, "data": category_info }) # 输出结果 print(result)
方案二:列表推导式简化实现
如果追求简洁,可以用嵌套推导式完成,注意修正循环顺序和字段完整性:
place_dict = only_on2[0] result = [ { "name_place": place_name, "data": { cat: { "UNIT #": [item['code'] for item in items if item['cats_name'] == cat], "Name": [item['name'] for item in items if item['cats_name'] == cat] } for cat in categories } } for place_name, items in place_dict.items() ]
两种方案均可生成符合要求的目标数据结构。
内容的提问来源于stack exchange,提问作者test new jiras
相关产品推荐
相关产品推荐

