Python按key分组列表求和时保留ingredient_unit字段方法
问题描述
基于Excel餐食选择生成购物清单时,已从CSV导入得到扁平化食材列表list_flat_ingredients,单条数据格式为[ingredient_amount, ingredient_unit, ingredient_name](对应[数量, 单位, 食材名])。
原有分组统计代码如下:
for i, g in groupby(sorted(list_flat_ingredients), key=lambda x: x[2]): shopping_list_in_order.append([sum(v[0] for v in g), i])
运行后输出结果丢失了ingredient_unit单位字段,无法正常使用。
根因分析
- 聚合逻辑只提取了每组的数量做求和、提取分组键(食材名)作为输出字段,没有读取单位字段;
itertools.groupby返回的分组对象是一次性迭代器,遍历一次后就会耗尽,无法在求和后再次遍历读取单位值。
修改方法
在分组循环内先将分组迭代器转为实体列表,同时完成数量求和、单位提取,再拼接成结果即可。修改后的代码如下:
from itertools import groupby shopping_list_in_order = [] # 排序时显式指定按食材名排序,避免其他字段干扰排序结果 for ingredient_name, group in groupby( sorted(list_flat_ingredients, key=lambda x: x[2]), key=lambda x: x[2] ): # 将一次性迭代器转为列表,支持多次读取 group_records = list(group) # 计算同食材总数量 total_amount = sum(record[0] for record in group_records) # 同一食材单位统一,取组内第一条记录的单位即可 ingredient_unit = group_records[0][1] # 按 [总数量, 单位, 食材名] 格式追加结果 shopping_list_in_order.append([total_amount, ingredient_unit, ingredient_name])
可选优化
- 过滤无效数据:示例数据中存在
[0.0, "0", "0"]的无效空行,可在分组前加过滤逻辑排除:list_flat_ingredients = [ item for item in list_flat_ingredients if item[2] != "0" and item[0] > 0 ] - 统一食材名称格式:部分食材名前后带多余空格(如
"Hirtenkäse "末尾有空格),可在排序分组前对名称做去空格处理,避免同食材因格式问题被分成多组。
内容的提问来源于stack exchange,提问作者CreateInsaneStuff
相关产品推荐
相关产品推荐

