如何按标签累加元组列表中的数值?
问题:按水果标签累加对应数值
给定元组列表:
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)]
修正方案
原代码的核心问题:
- 分组键错误:
itertools.groupby用了operator.itemgetter(0)(按数值字符串分组),而非水果标签(应取元组第2个元素,即itemgetter(1))。 - 未预排序:
itertools.groupby仅对连续相同键的元素分组,必须先按水果标签排序,确保同标签元素聚集。 - 变量命名冲突:
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
相关产品推荐
相关产品推荐

