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

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单位字段,无法正常使用。

根因分析
  1. 聚合逻辑只提取了每组的数量做求和、提取分组键(食材名)作为输出字段,没有读取单位字段;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:12:33