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
相关产品推荐
相关产品推荐

