2

次のことを行う Python 関数を作成し、各行から数値を追加して、平均を見つけることができます。これは私のファイルがどのように見えるかです:

 -2.7858521
 -2.8549764
 -2.8881847
  2.897689
  1.6789098
 -0.07865
  1.23589
  2.532461
  0.067825
 -3.0373958

基本的に、行ごとに for ループを実行し、行のカウンターをインクリメントし、各行を float 値に設定するプログラムを作成しました。

   counterTot = 0      
   with open('predictions2.txt', 'r') as infile:
            for line in infile:
                counterTot += 1
                i = float(line.strip())

今、私はリルが立ち往生する部分です

   totalSum = 
   mean =  totalSum / counterTot
   print(mean)

あなたが言うことができるように、Pythonは初めてですが、テキスト分析作業には非常に便利だと思うので、それに取り掛かります。

追加機能

追加機能も検討していました。ただし、上記のように別の関数にする必要があります。

  counterTot = 0      
   with open('predictions2.txt', 'r') as infile:
            for line in infile:
                counterTot += 1
                i = float(line.strip())
                                    if i > 3:
                                        i = 3
                                    elif i < -3:
                                        i = -3

コードからわかるように、関数は数値が 3 より大きいかどうかを判断し、大きい場合は 3 にします。数値が -3 より小さい場合は -3 にします。しかし、これを新しいファイルに出力して、その構造をそのまま維持しようとしています。どちらの状況でも、小数点以下の桁数を維持したいと思います。私はいつでも自分で出力数値を四捨五入できます。数値がそのまま必要なだけです。

4

5 に答える 5

5

要素をリストにロードせずに、fileinputそれを使用して行数を取得することで、これを行うことができます。

import fileinput

fin = fileinput.input('your_file')
total = sum(float(line) for line in fin)
print total / fin.lineno()
于 2013-06-06T14:01:23.890 に答える
3

ここで使用できenumerateます:

with open('predictions2.txt') as f:
     tot_sum = 0
     for i,x in enumerate(f, 1):
         val = float(x)
         #do something with val
         tot_sum += val           #add val to tot_sum 
     print tot_sum/i              #print average

#prints -0.32322842
于 2013-06-06T13:48:42.503 に答える
1

とに変更5.1234する必要があるということですか?3.1234-8.5432-3.5432

line = "   -5.123456   "

i = float(line.strip())

if i > 3:
    n = int(i)
    i = i - (n - 3)

elif i < -3:
    n = int(i)
    i = i - (n + 3)

print(i)

それはあなたに与える

-3.123456

編集:

短いバージョン

line = "   -5.123456   "

i = float(line.strip())

if i >= 4:
    i -= int(i) - 3

elif i <= -4:
    i -= int(i) + 3

print(i)

編集2:

("3" と 4x "0") と( "-3" と 7x "0")に変更5.1234する必要がある場合3.0000-8.7654321-3.0000000

line = "   -5.123456   "

line = line.strip()

i = float(line)

if i > 3:
    length = len(line.split(".")[1])
    i = "3.%s" % ("0" * length) # now it will be string again

elif i < -3:
    length = len(line.split(".")[1])
    i = "-3.%s" % ("0" * length) # now it will be string again


print(i)
于 2013-06-06T14:37:55.857 に答える
0

これはより詳細なバージョンです。無効な行 (ある場合) を無視するのではなく、ニュートラルな値に置き換えることができます。

numbers = []
with open('myFile.txt', 'r') as myFile:
    for line in myFile:
        try:
            value = float(line)
        except ValueError, e:
            print line, "is not a valid float" # or numbers.append(defaultValue) if an exception occurred
        else:
            numbers.append(value)
print sum(numbers) / len(numbers)

2 番目のリクエストについては、最も簡単な解決策を次に示します (その他の解決策はこちら) 。

def clamp(value, lowBound, highBound):
    return max(min(highBound, value), lowBound)

それを私たちのリストに適用する:

clampedValues = map(lambda x: clamp(x, -3.0, 3.0), numbers)
于 2013-06-06T14:21:16.837 に答える