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

如何按水果种类计算对应数值总和?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'

错误原因

  1. 遍历顺序错误:元组格式为(水果名称, 数值字符串),但代码中for n, f in number_found把数值字符串赋值给n,水果名称赋值给f,导致键值完全颠倒。
  2. 数值格式不兼容:Python默认识别的数值格式是千分位用逗号、小数用点,而这里的字符串是千分位用点、小数用逗号,直接转int/float会触发格式错误。

修复方案

  1. 编写转换函数,将欧洲格式的数值字符串转为可计算的数值:
    • 先移除千分位的点
    • 将小数分隔符逗号替换为点
    • 转为float后可选择取整(根据期望输出的整数格式)
  2. 修正遍历顺序,正确获取水果名称和数值字符串
  3. 按水果分类累加数值,最后生成结果字符串

修复后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:05:28