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

如何按标签累加元组列表中的数值?

问题:按水果标签累加对应数值

给定元组列表:

fruit_list_amount = [('16', 'Watermeloenen'), ('360', 'Watermeloenen'), ('6', 'Watermeloenen'), ('75', 'Watermeloenen'), ('9', 'Watermeloenen'), ('688', 'Appels'), ('22','Sinaasappels')] 

需求是按水果标签(如Watermeloenen)累加对应的数值,例如计算16+360+6+75+9的总和。

尝试的代码:

import locale
from locale import atof, setlocale, LC_NUMERIC
import itertools
import operator

def accumulate_first(l):
    locale._override_localeconv["thousands_sep"] = "."
    locale._override_localeconv["decimal_point"] = ","
    locale.setlocale(locale.LC_ALL, locale='de_DE.UTF-8')
    it = itertools.groupby(l, operator.itemgetter(0))
    for key, subiter in it:
        yield key, sum(locale.atof(key[0]) for key in subiter)

返回结果不符合预期:

[('16', 16.0), ('360', 360.0), ('6', 6.0), ('75', 75.0), ('9', 9.0), ('688', 688.0), ('22', 22.0)]

修正方案

原代码的核心问题:

  1. 分组键错误:itertools.groupby用了operator.itemgetter(0)(按数值字符串分组),而非水果标签(应取元组第2个元素,即itemgetter(1))。
  2. 未预排序:itertools.groupby仅对连续相同键的元素分组,必须先按水果标签排序,确保同标签元素聚集。
  3. 变量命名冲突:sum生成器里的key和外层分组键重名,导致逻辑错误。

修正后的代码:

import locale
import itertools
import operator

def accumulate_first(l):
    # 配置德语区域格式(处理千分位和小数点)
    locale._override_localeconv["thousands_sep"] = "."
    locale._override_localeconv["decimal_point"] = ","
    locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
    
    # 先按水果标签排序,保证同标签元素连续
    sorted_list = sorted(l, key=operator.itemgetter(1))
    # 按水果标签(元组第2项)分组
    it = itertools.groupby(sorted_list, operator.itemgetter(1))
    
    for fruit_name, subiter in it:
        # 累加分组内的数值,用item避免变量名冲突
        total = sum(locale.atof(item[0]) for item in subiter)
        yield fruit_name, total

# 调用并查看结果
result = list(accumulate_first(fruit_list_amount))
print(result)

运行结果:

[('Appels', 688.0), ('Sinaasappels', 22.0), ('Watermeloenen', 466.0)]

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:55:25