【问题标题】:My average function is returning slightly wrong answer [closed]我的平均函数返回的答案略有错误[关闭]
【发布时间】:2021-12-06 04:24:47
【问题描述】:

我正在计算 csv 文件一列中数字的平均值。它正在工作,但我的回答与它需要的有点不同。例如;我输入的一个过滤器在它应该是 49.94 时返回 49.93。另一个应该是 23.17 时是 23.05。一个是 37.02 而不是 37.21。我要疯了,想弄清楚如何解决这个问题。另外,我最初想要lenl = 0.0,但是当我这样做时它不会计算,因为你不能除以零,即使计数器应该还在上升?请帮忙

import csv

        
date_index = 0
temp_index = 2

def average_temperature(weather, filter):
    thefile = csv_reader("Temperatures.csv")
    suml = 0.0
    lenl = 1.0
    for row in thefile:
        if filter in row[date_index]:
            suml += float(row[temp_index])
            lenl += 1.0
        avg = suml / lenl
    return avg

【问题讨论】:

  • 使lenl = 0 将平均计算取消缩进到最后一次,然后执行avg = suml / (lenl or 1) 这将使(0.0/0.0) 更改为(0.0/1)
  • 将 len 初始化为零,而不是一。
  • lenl 没有必要是一个浮点数,它自然是一个整数,而且整数可以很好地进行数学运算。
  • 欢迎来到 Stack Overflow!请拨打tour。如需调试帮助,您需要创建一个minimal reproducible example,包括完整但最少的代码(首先,调用average_temperature())和示例输入。看起来 CSV 实际上与问题无关,除了数据所在的位置,在这种情况下,删除 csv 标记。如需更多提示,请参阅How to Ask

标签: python csv average


【解决方案1】:

len 初始化为0。在循环外进行avg 计算。 您可以在最后添加一个try-except 块来捕获0/0 的情况并进行处理-

import csv

        
date_index = 0
temp_index = 2

def average_temperature(weather, filter):
    thefile = csv_reader("Temperatures.csv")
    suml = 0
    lenl = 0
    for row in thefile:
        if filter in row[date_index]:
            suml += row[temp_index]
            lenl += 1
    try:
        avg = suml / lenl
    except ZeroDivisionError:
        avg = 0

    return avg

【讨论】:

  • Try/except 是 Python 中常用的推荐方法,EAFP vs. LBYL。但在这种特殊情况下,显式测试零似乎非常简单:avg = suml / lenl if lenl else 0
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多