2017-05-03 41 views
0

我試圖找到此格式txt文件的最小值和最大值(浮點):試圖找到從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() 
+1

'grade'是一個浮點數,所以我不確定你期望'min'和'max'如何處理浮點數,但正如錯誤所述,浮點數是不可迭代的。順便說一句,你的'for'循環,'gradebook_file'中的行不起作用,因爲你已經用盡了文件處理程序。你必須「尋找」回到文件的開頭,或者更好的是,每次你想遍歷它們時,使用'with'塊來打開你的文件。 –

回答

0

你丟棄每個grade當你讀下一個,而不是使用的序列存儲他們min/max。因此,您正試圖計算出現的最後一個年級的最小值和最大值,這是無意義的(您計算一組值的最小值和最大值,而不是單個值)。您需要隨時保存成績,或保持最小和最大運行(使用較少的內存,但需要更多自定義代碼才能出錯)。

如果你想存儲的所有成績,嘗試這樣的事情:

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 

然後繼續運行由replacin最小值和最大值G:

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。這種方法意味着真正龐大的一組輸入只需要掃描一次,而不是存儲,而不是存儲所有等級並掃描兩次。在性能方面,這不太可能是重要的,除非你的輸入如此之大,否則可能會導致內存不足(對於等級跟蹤程序來說不太可能)。

相關問題