Python计算行数,其中数字小于或大于某个值

3
我是一名初学者,正在编写一个计算行数的Python程序。文件内容如下:
  0.86149806
  1.8628227
 -0.1380086
 -1
  0.99927421
 -1.0007207
  0.99927421
  0.99926955
  -1.0007258

我的代码尝试如下:

counterPos = 0
counterNeg = 0
counterTot = 0
counterNeu = 0
with open('test.txt', 'r') as infile:
    for line in infile:
        counterTot += 1
        for i in line:
            if i > 0.3:
                counterPos += 1
            elif i < -0.3:
                counterNeg += 1
            else:
                counterNeu += 1

我正在尝试让它计算所有小于-0.3的行数并将其归为counterNeg,所有大于0.3的行数为counterPos,所有数字介于0.29和-0.29之间的行数为counterNeu

然而似乎并不起作用,我知道在for i in line这一步出错了,但不确定问题出在哪里。


1
0.29和0.3之间的数字怎么办(以及-0.3和-0.29之间的数字)? - abarnert
嗯,我该怎么修复这个问题呢? - RHK-S8
@abarnert 在0.29和0.3之间的数字只会将counterNeu增加1,不是吗?因为0.29 > 0.30.29 < -0.3都是false,所以执行else:块。 - user2032433
@RHK-S8:这取决于您希望这些数字发生什么。您想要将它们递增counterNeu吗?(在这种情况下,您已经完成了。)不递增?将counterPoscounterNeu每个递增0.5?还是其他什么? - abarnert
我认为0.3和-0.3以上以下的所有内容都应该能够正常工作。 - RHK-S8
显示剩余2条评论
3个回答

6

您的 line 是一个字符串,但您想将其解析为一个 float。只需使用 float(line)

另外,最好从您的行的开头和结尾去除所有空格,以防万一。所以:

for line in infile:
    i = float(line.strip())
    # ... count

通过审核,你至少应该提到额外的循环。 - user2032433
@MarkusMeskanen 对不起,你在说什么额外的循环? - kirelagin
他正在遍历每行中的每个字符。对于infile中的每一行,他都会使用for循环来遍历每个字符。 - user2032433
@MarkusMeskanen 他说他意识到这不正确。你认为使用我提供的代码可以保留那个额外的循环吗? - kirelagin
我知道保留那个额外的循环是不可能的,所以你应该提醒他将其删除,天啊。 - user2032433

3

您使用了一个多余的循环。 此外,从文件中读取的数据以"\n"作为换行符的字符串形式出现。请使用strip()方法去掉"\n",然后将数据转换为浮点数。

最终代码应该如下:

counterPos = 0
counterNeg = 0
counterTot = 0
counterNeu = 0
with open('temp.txt', 'r') as infile:
        counterTot += 1
        for i in infile:            
                if float(i.strip()) > 0.3:
                    counterPos += 1
                elif float(i.strip()) < -0.3:
                    counterNeg += 1
                else:
                    counterNeu += 1

-1

当我发现自己需要进行大量测试时,通常会采取以下方式:

data='''\
  0.86149806
  1.8628227
 -0.1380086
 -1
  0.99927421
 -1.0007207
  0.99927421
  0.99926955
  -1.0007258'''

def f1(x):
    ''' >0.3 '''
    return x>0.3

def f2(x):
    ''' <-0.3 '''   
    return x<-.3

def f3(x):
    ''' not f1 and not f2 '''   
    return not f1(x) and not f2(x)

tests={f1: 0,
       f2: 0,
       f3: 0 }

for line in data.splitlines():
    for test in tests:
        if test(float(line.strip())): 
            tests[test]+=1

for f,v in sorted(tests.items()):
    print '{:3}{:20}:{}'.format(f.__name__, f.__doc__, v)

输出:

f1  >0.3               :5
f2  <-0.3              :3
f3  not f1 and not f2  :1

考虑到他在Python方面还不太精通(根据原帖),我看不出这如何能帮助他或回答他的问题。这就好像他问如何制造车轮,而你却教他如何制造汽车一样。 - user2032433
我认为没有必要用编程“婴儿语”与新手交流。使用字典映射而不是一堆单独的变量是Python编程的核心习惯。 - dawg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接