尝试从带有字符串和浮点数的 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
。这种方法意味着真正庞大的输入集只需要扫描一次,根本不需要存储,而不是存储所有等级并扫描两次。就性能而言,这不太可能重要,除非您的输入非常大,否则您可能 运行 内存不足(不太可能用于成绩跟踪程序)。
我正在尝试从格式如下的 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
。这种方法意味着真正庞大的输入集只需要扫描一次,根本不需要存储,而不是存储所有等级并扫描两次。就性能而言,这不太可能重要,除非您的输入非常大,否则您可能 运行 内存不足(不太可能用于成绩跟踪程序)。