开发者

Reason for two similar codes giving different result and different approaches to this task

开发者 https://www.devze.com 2023-03-06 13:04 出处:网络
The question is def sum_number开发者_开发知识库s_in_file(filename): \"\"\" Return the sum of the numbers in the given file (which only contains

The question is

def sum_number开发者_开发知识库s_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
    """

this is my first code:

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

this is my second code:

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

however the first one returns 19138 and the second one 18138

numbers.txt contains the following:

1000 
15000 
2000 
1138


Because m = f.readLine() already reads 1 line from f and then you do the operation with the rest of the lines. If you delete that statement the 2 outputs will be the same. (I think :))


I'd say that m = f.readline() in the second snippet skips the first line (which contains 1000), that's why you get a wrong result.


As requested.. another approach to the question:

import re

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


As said by answers, you are skipping first line because f.readline(). But a shorter approach would be:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号