2

我正在编写一个 python 函数来执行以下操作,从每一行添加数字,这样我就可以找到平均值。这是我的文件的样子:

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

基本上,我编写了一个程序,为每一行执行一个 for 循环,递增行数并将每行设置为浮点值。

   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 回答
3

我想你想要这样的东西:

with open('numbers.txt') as f:
    numbers = f.readlines()
    average = sum([float(n) for n in numbers]) / len(numbers)
    print average

输出:

-0.32322842

它从 读取您的数字numbers.txt,用换行符拆分它们,将它们转换为浮点数,将它们全部相加,然后将总数除以列表的长度。

于 2013-06-06T13:52:30.600 回答
1

你的意思是你需要改变5.1234to3.1234-8.5432to-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:

如果需要更改5.12343.0000("3" and 4x "0") 和-8.7654321( -3.0000000"-3" and 7x "0")

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)

对于您的第二个请求,这里是最直接的解决方案(更多解决方案在这里

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 回答