2017-05-03 3 views
0

を浮きます、私はは、私はこのようにフォーマットtxtファイルから最小値と最大値(山車)を見つけようとしている文字列でtxtファイルから最小値と最大値を見つけようと

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'が浮動小数点で何をするのかよく分かりませんが、浮動小数点型はiterableではありません。とにかく、あなたの 'for'ループ、' for line in gradebook_file'は既にファイルハンドラを使い果たしたので動作しません。あなたは、ファイルの先頭に戻るか、より良い方法では、それらを繰り返し処理するたびにファイルを開くために 'with'ブロックを使用する必要があります。 –

答えて

0

あなたはむしろmin/maxで使用するための順序でそれらを保存するよりも、次のものを読んでいるあなたは、各gradeを破棄しています。したがって、見た目の最後の成績の最小値と最大値を計算しようとしています。これは無意味です(単一の値ではなく、値の集合の最小値と最大値を計算します)。あなたは、あなたが行くにつれて成績を保持する必要がありますか実行最小および最大(少ないメモリを使用して、間違って得ることができるより多くのカスタムコードが必要)を保持する必要があります。

あなたは、すべてのグレードを保存し、このような何かを試してみたい場合:

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を使用する代わりに、ちょうど得るためにそれらの2には、交換するために次のようになります。

data = [] 

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

その後、replacinによって最小値と最大値を実行し続けますG:

_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 

と削除:と

data.append(grade) # Store for later 

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

あなたはもはやdataを作成するか、または移入以来。そのアプローチは、すべての成績を保存して2回スキャンするのではなく、1回だけスキャンして保存する必要があるということを意味します。パフォーマンス面では、あなたのインプットが非常に大きい場合を除いて、(グレードトラッキングプログラムではそうではない)メモリ不足の場合を除き、問題はありません。

関連する問題