尝试从带有字符串和浮点数的 txt 文件中查找最小值和最大值

Trying to find min and max from txt file with strings and floats

我正在尝试从格式如下的 txt 文件中查找最小值和最大值(浮点数):

name
grade
name
grade
name
grade

当我 运行 我的代码时,我得到一个

TypeError: 'float' object is not iterable

这是我的代码,似乎无法解决问题。

def main ():
    #open gradebook
    gradebook_file = open ('gradebook.txt', 'r')

    #define name
    name = gradebook_file.readline ()

    while name != '':
        grade = float (gradebook_file.readline ())

        name = name.rstrip ('\n')

        print ('Name:', name)
        print ('Grade:', grade)

        name = gradebook_file.readline ()  

    #append numbers in gradebook
    data = []
    for lines in gradebook_file:
        data.append (grade)

    #define min and max values
    _min = min (grade)
    _max = max (grade)

    #print contents
    print ('The minimum average grade was a(n) ' + str (_min) + '.')
    print ('The maximum average grade was a(n) ' + str (_max) + '.')

    #close the gradebook
    gradebook_file.close ()

#call main
main ()

您在阅读下一个时会丢弃每个 grade,而不是将它们按顺序存储以供 min/max 使用。因此,您试图计算所见最后成绩的最小值和最大值,这是无意义的(您计算值集合的最小值和最大值,而不是单个值)。您需要随时保留成绩,或者保持 运行ning 最小值和最大值(使用更少的内存,但需要更多的自定义代码,您可能会出错)。

如果你想存储所有的成绩,试试这样:

from future_builtins import map, zip  # Required on Python 2 for lazy map/zip

def main ():
    #open gradebook using with statement, so it's closed automatically/predictable
    with open('gradebook.txt') as gradebook_file:
        data = []

        # Pair your lines up automatically with zip
        # and convert grades to floats automatically with map
        for name, grade in zip(gradebook_file, map(float, gradebook_file)):
            name = name.rstrip('\n')

            print('Name:', name)
            print('Grade:', grade)
            data.append(grade)  # Store for later

    #define min and max values
    _min = min(data)
    _max = max(data)

    #print contents
    print('The minimum average grade was a(n) {}.'.format(_min))
    print('The maximum average grade was a(n) {}.'.format(_max))

#call main
if __name__ == '__main__':
    main()

使用 data 存储所有成绩只是为了获得其中两个成绩的替代方法是替换:

data = []

与:

_min, _max = float('inf'), float('-inf')  # Initial values; will be replaced immediately

然后通过替换保持 运行ning 最小值和最大值:

data.append(grade)  # Store for later

与:

_min = min(_min, grade)  # Or faster but more verbose: if grade < _min: _min = grade
_max = max(_max, grade)  # Or faster but more verbose: if grade > _max: _max = grade

并删除:

_min = min(data)
_max = max(data)

因为您不再创建或填充 data。这种方法意味着真正庞大的输入集只需要扫描一次,根本不需要存储,而不是存储所有等级并扫描两次。就性能而言,这不太可能重要,除非您的输入非常大,否则您可能 运行 内存不足(不太可能用于成绩跟踪程序)。