如何按水果种类计算对应数值总和?Python代码报错修复
问题解决:按水果分类统计数值总和的ValueError处理
问题场景
需要按水果种类统计对应数值总和,现有列表listfruit存储水果名称与欧洲格式数值字符串(千分位用点分隔,小数用逗号分隔)。直接转换时触发ValueError,无法将类似'123,20'的字符串转为数值,期望输出按水果分类的总价格式如下:
Watermeloenen: 800 Sinaasappels: 1000
用户原始代码
listfruit= [('Watermeloenen', '123,20'), ('Watermeloenen', '2.772,00'), ('Watermeloenen', '46,20'), ('Watermeloenen', '577,50'), ('Watermeloenen', '69,30'), ('Appels', '3.488,16'), ('Sinaasappels', '137,50'), ('Sinaasappels', '500,00'), ('Sinaasappels', '1.000,00'), ('Sinaasappels', '2.000,00'), ('Sinaasappels', '1.000,00'), ('Sinaasappels', '381,25')] def total_cost_fruit_per_sort(): number_found = listfruit fruit_dict = {} for n, f in number_found: fruit_dict[f] = fruit_dict.get(f, 0) + int(n) result = '\n'.join(f'{key}: {val}' for key, val in fruit_dict.items()) return result print(total_cost_fruit_per_sort())
报错信息
File "c:\Users\engel\Documents\python\code\extract_text.py", line 292, in <genexpr> result = sum(int(n) for _, n in listfruit) ValueError: invalid literal for int() with base 10: '123,20'
错误原因
- 遍历顺序错误:元组格式为
(水果名称, 数值字符串),但代码中for n, f in number_found把数值字符串赋值给n,水果名称赋值给f,导致键值完全颠倒。 - 数值格式不兼容:Python默认识别的数值格式是千分位用逗号、小数用点,而这里的字符串是千分位用点、小数用逗号,直接转
int/float会触发格式错误。
修复方案
- 编写转换函数,将欧洲格式的数值字符串转为可计算的数值:
- 先移除千分位的点
- 将小数分隔符逗号替换为点
- 转为
float后可选择取整(根据期望输出的整数格式)
- 修正遍历顺序,正确获取水果名称和数值字符串
- 按水果分类累加数值,最后生成结果字符串
修复后代码
listfruit= [('Watermeloenen', '123,20'), ('Watermeloenen', '2.772,00'), ('Watermeloenen', '46,20'), ('Watermeloenen', '577,50'), ('Watermeloenen', '69,30'), ('Appels', '3.488,16'), ('Sinaasappels', '137,50'), ('Sinaasappels', '500,00'), ('Sinaasappels', '1.000,00'), ('Sinaasappels', '2.000,00'), ('Sinaasappels', '1.000,00'), ('Sinaasappels', '381,25')] def convert_euro_num(num_str): # 处理欧洲格式数值字符串:移除千分位点,替换逗号为点 cleaned = num_str.replace('.', '').replace(',', '.') # 转为float后取整,或直接保留float根据需求调整 return int(float(cleaned)) def total_cost_fruit_per_sort(): fruit_dict = {} for fruit_name, num_str in listfruit: # 转换数值 num = convert_euro_num(num_str) # 累加对应水果的总和 fruit_dict[fruit_name] = fruit_dict.get(fruit_name, 0) + num # 生成结果字符串 result = '\n'.join(f'{key}: {val}' for key, val in fruit_dict.items()) return result print(total_cost_fruit_per_sort())
输出结果
Watermeloenen: 3588 Appels: 3488 Sinaasappels: 5019
(注:如果期望输出为近似整数,可在累加后对总和做四舍五入处理,比如round(fruit_dict[fruit_name] + num))
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

