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

Python如何通过列表推导式按cleaning_type分组转换列表结构

Python 按字段分组转换列表结构实现方法

需求说明

给定存储清洁服务条目的字典列表,需要按cleaning_type字段分组,将同一清洁类型下的所有service_name归集为数组,最终输出带分组自增id、分组类型、服务名列表的目标结构。

原始参考数据

cleaning_services = [
    {"id": 1, "cleaning_type": "Lite service", "service_name": "Floors"},
    {"id": 2, "cleaning_type": "Lite service", "service_name": "Bathrooms"},
    {"id": 3, "cleaning_type": "Lite service", "service_name": "Kitchen"},
    {"id": 4, "cleaning_type": "Moving cleaning", "service_name": "Kitchen Including All Appliances And Cabinets"},
    {"id": 5, "cleaning_type": "Moving cleaning", "service_name": "Shift Products"},
]

实现方案

分组操作无法通过单层列表推导式直接完成——因为分组需要先遍历全量数据完成归类,无法边遍历单条数据边直接生成最终分组条目。常规实现分两步:先通过字典中转归集同类型的服务名,再通过列表推导式组装成目标格式。

推荐写法(可读性优先)

# 1. 按清洁类型归集服务名称
group_collect = {}
for entry in cleaning_services:
    service_type = entry["cleaning_type"]
    if service_type not in group_collect:
        group_collect[service_type] = []
    group_collect[service_type].append(entry["service_name"])

# 2. 列表推导式生成目标结构,分组id从1开始按顺序自增
final_result = [
    {"id": order, "cleaning_type": type_name, "service_name": service_list}
    for order, (type_name, service_list) in enumerate(group_collect.items(), start=1)
]

运行后得到的输出和要求的目标格式完全一致:

[
  {
    "id": 1,
    "cleaning_type": "Lite service",
    "service_name": ["Floors", "Bathrooms", "Kitchen"],
  },
  {
    "id": 2,
    "cleaning_type": "Moving cleaning",
    "service_name": ["Kitchen Including All Appliances And Cabinets","Shift Products"],
  },
]

贴合“列表推导式”要求的精简写法

如果要尽可能多的使用列表推导式完成逻辑,可以借助collections.defaultdict简化归集步骤:

from collections import defaultdict

service_group = defaultdict(list)
# 利用列表推导式遍历完成归集(仅为满足推导式写法要求,生产环境不推荐,会生成无意义的空列表)
[service_group[item["cleaning_type"]].append(item["service_name"]) for item in cleaning_services]
# 推导式组装最终结果
final_result = [{"id": idx+1, "cleaning_type": k, "service_name": v} for idx, (k, v) in enumerate(service_group.items())]

注意:列表推导式的设计目的是生成新列表,用它来执行遍历追加的副作用逻辑会降低代码可读性,日常开发优先选普通for循环写归集逻辑更易维护。


内容的提问来源于stack exchange,提问作者Iqbal Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:39:19