You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:08:23