代码说 float 对象不是“float”对象不可迭代

Code says float object not 'float' object is not iterable

提问人:Stephen Martinez 提问时间:8/29/2022 最后编辑:AlexanderStephen Martinez 更新时间:8/31/2022 访问量:133

问:

我不确定我在这里做错了什么,但出于某种原因,每次我更正代码或尝试让它遍历 CSV 文件时,它都会给我一个不可迭代的浮点对象。如果有人能给我一些关于如何遍历浮点数组的指示,我将不胜感激。

    import pickle
    from weatherreading import WeatherReading
    
    
    def valid_temperature(temperature : float):
        return -40 < temperature < 85
    
    def valid_pressure(pressure : float):
        return 300 < pressure < 1200
    
    
    def valid_humidity(humidity : float):
        return 20 < humidity < 80 
    
    
    def valid_reading(temperature : float, pressure : float, humidity : float):
        return valid_temperature(temperature) and valid_pressure(pressure) and valid_humidity(humidity)
    
    
    def get_readings_from_file(filename : str, skip_first_line : bool) -> list[WeatherReading]:

   
    with open(filename, "r") as file: 
        # Note that we're stating that the list is a List of WeatherReading instances
        all_readings : list[WeatherReading] = [] 
        first_line = True

        for line in file: 
            if skip_first_line and first_line:
                first_line = False
                continue 

            split = line.split(",") #split the data at every comma
            temperature = float(split[0]) #First column
            pressure = float(split[1]) #second column
            humidity = float(split[2]) #third column

            def max_temperature():
                maxTemp = []
                for i in temperature:
                    maxTemp.append(i)
                return max(maxTemp)

            def min_pressure():
                minPress = []
                for i in pressure:
                    minPress.append(float[i])
                return min(minPress)

            def max_humidity():
                maxHum = []
                for i in humidity:
                    maxHum.append(float[i])
                return max(maxHum)

            if valid_reading(max_temperature(), min_pressure(), max_humidity()):
                reading = WeatherReading(max_temperature(), min_pressure(), max_humidity())
                all_readings.append(reading)
    
        return all_readings


if __name__ == "__main__":

    filename = input("Enter CSV file name: ")

    all_readings = get_readings_from_file(filename, True)

    # Echo the input to output.
    print("Your readings:")
    for reading in all_readings:
        print(f"\tTemp: {reading.temperature}", end="")
        print(f"\tPressure: {reading.pressure}", end="")
        print(f"\tHumidity: {reading.humidity}")

    pickle_demo = open('pickle_demo.bin', 'wb')
    pickle.dump(all_readings, pickle_demo)
    pickle_demo.close()
python list csv 浮动精度

评论

0赞 Alexander 8/29/2022
在 and 函数中,您尝试遍历不可迭代的浮点数。 <--温度是一个浮点数。你不能对浮点数执行 for 循环max_temperaturemin_pressurefor i in temperature
0赞 Stephen Martinez 8/29/2022
是的,我知道,我的问题是,即使它们是浮点数,我如何遍历它们。
0赞 Stephen Martinez 8/29/2022
不,我正在尝试在 CSV 文件中查找最小值/最大值,对于温度,我正在查找最大值、压力最小值和最大湿度值
0赞 Ignatius Reilly 8/29/2022
还行。。。所以你要做的是把每列的所有值都放到一个列表中,然后取 ,对吧?max
0赞 Ignatius Reilly 8/29/2022
为此,您应该提前创建这些列表(在遍历行之前)并附加每个值。不要遍历每个值(单个元素)。但是有一些专门用于这项工作的模块,例如 csvpandas

答:

1赞 Alexander 8/29/2022 #1

您可以做的是在将值从 csv 文件行中拆分到它们自己的列表中后收集这些值,然后在收集完这些值后执行计算。

例如:

import pickle
from weatherreading import WeatherReading

def valid_temperature(temperature : float):
    return -40 < temperature < 85

def valid_pressure(pressure : float):
    return 300 < pressure < 1200

def valid_humidity(humidity : float):
    return 20 < humidity < 80

def valid_reading(temperature : float, pressure : float, humidity : float):
    return valid_temperature(temperature) and valid_pressure(pressure) and valid_humidity(humidity)

def get_readings_from_file(filename : str, skip_first_line : bool) -> list:
    with open(filename, "r") as file:
        all_readings = []
        temps, pressures, humidities = [], [], []
        first_line = True
        for line in file:
            if skip_first_line and first_line:
                first_line = False
                continue
            # split the line and convert to floats
            temp, press, humid = map(float, line.split(","))
            temps.append(temp)        # append each value to its own
            pressures.append(press)   # list collection
            humidities.append(humid)
        maxTemp = max(temps)          # max and min values 
        minPress = min(pressures)     
        maxHums = max(humidities)
        if valid_reading(maxTemp, minPress,  maxHums):
            reading = WeatherReading(maxTemp, minPress, maxHums)
            all_readings.append(reading)
        return all_readings

 
if __name__ == "__main__":
    filename = input("Enter CSV file name: ")
    all_readings = get_readings_from_file(filename, True)
    print("Your readings:")
    for reading in all_readings:
        print(f"\tTemp: {reading.temperature}", end="")
        print(f"\tPressure: {reading.pressure}", end="")
        print(f"\tHumidity: {reading.humidity}")
    pickle_demo = open('pickle_demo.bin', 'wb')
    pickle.dump(all_readings, pickle_demo)
    pickle_demo.close()

对函数进行这几处更改,您的脚本应该可以正常工作get_readings_from_file

评论

0赞 Stephen Martinez 8/29/2022
嘿,兄弟,你在编辑它之前拥有它的方式是完美的。
0赞 Alexander 8/29/2022
@StephenMartinez这是一回事......我只是删除了我没有编辑的部分,以便更清楚地看到我编辑了哪些部分......
0赞 Stephen Martinez 8/31/2022
它不起作用,输出是空白的
0赞 Alexander 9/3/2022
@StephenMartinez我把它改回来了