两个相似的代码为什么会产生不同的结果,以及处理此任务的不同方法。

3
问题是:
def sum_numbers_in_file(filename):
    """
    Return the sum of the numbers in the given file (which only contains
    integers separated by whitespace).
    >>> sum_numbers_in_file("numbers.txt")
    19138
    """

这是我的第一段代码:

rtotal = 0
myfile = open(filename,"r")
num = myfile.readline()
num_list = []

while num:
    number_line = ""
    number_line += (num[:-1])
    num_list.append(number_line.split(" "))
    num = myfile.readline()
for item in num_list:
    for item2 in item:
        if item2!='':
            rtotal+= int(item2)
return rtotal

这是我的第二段代码:

f = open(filename)
m = f.readline()
n = sum([sum([int(x) for x in line.split()]) for line in f])
f.close()
return n

然而第一个返回19138,第二个返回18138。

numbers.txt 包含以下内容:

1000 
15000 
2000 
1138

只是针对你的方法提出一点意见。问题指定了由空格隔开的整数,而你的实现假设为换行符。你可以先读取整个文件,然后按 '\r\n ' 进行拆分,或使用正则表达式。 - Blazes
4个回答

4

因为m = f.readLine()已经从f中读取了一行,然后你对其余的行进行操作。如果删除该语句,则两个输出将相同。(我想是这样的 :))


2

如您所请求的,这是另一种回答问题的方法:

import re

def sum(filename):
  return sum(int(x.group()) for x in re.finditer(r'\d+',open(filename).read()))

2

我认为第二段代码中的m = f.readline()跳过了第一行(其中包含1000),这就是为什么您得到错误结果的原因。


1

正如其他答案所说,你跳过了第一行是因为使用了f.readline()。但更简洁的方法是:

n=sum((int(line[:-1]) for line in open("numbers.txt") if line[0].isnumeric()))

不符合要求。如果一行中有多个(以空格分隔的)数字,它将会出错。此外,在行末切掉最后一个字符并不是很有用,当EOL标记超过一个字符时更是如此。然而,方便的是,int对于前导和尾随空格是宽容的。 - MattH

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