Pythonic方法对文件中所有奇数行求和

Pythonic方法对文件中所有奇数行求和,python,python-2.7,Python,Python 2.7,我正在学习Python,准备参加研究生院的一次编程测试,这是我第一次编写一个小脚本来感受它。我的背景主要是C#和PHP,但在测试中我不能使用这两种语言 我的测试脚本读取以下文本文件(test_file1.txt)。偶数行包含样本大小,奇数行包含样本中每个测试的“结果”。EOF标记为0。我想读入文件,输出样本大小,并对每个测试的结果求和。您将如何使用Python执行此任务?我觉得我试图强迫python像PHP或C#,从我的研究中,我猜有很多“python”的方法来做这件事 test_file1.t

我正在学习Python,准备参加研究生院的一次编程测试,这是我第一次编写一个小脚本来感受它。我的背景主要是C#和PHP,但在测试中我不能使用这两种语言

我的测试脚本读取以下文本文件(test_file1.txt)。偶数行包含样本大小,奇数行包含样本中每个测试的“结果”。EOF标记为0。我想读入文件,输出样本大小,并对每个测试的结果求和。您将如何使用Python执行此任务?我觉得我试图强迫python像PHP或C#,从我的研究中,我猜有很多“python”的方法来做这件事

test_file1.txt:

3
13 15 18
5 
19 52 87 55 1
4
11 8 63 4
2
99 3
0
我的简单脚本:

file = open("test_file1.txt", "r")

i=0
for line in file:
    if i % 2 == 0:
        #num is even
        if line == '0':
            #EOF
            print 'End of experiment'   
    else:
        #num is odd
        numList = line.split( )
        numList = [int(x) for x in numList]
        print 'Sample size: ' + str(len(numList)) + ' Results: ' + str(sum(numList))
    i += 1

file.close()
我的结果:

Sample size: 3 Results: 46
Sample size: 5 Results: 214
Sample size: 4 Results: 86
Sample size: 2 Results: 102
End of experiment
谢谢

你可以做:

with open("test_file1.txt", "r") as inf:
    lines = inf.readlines()
    for l in lines[1::2]:  # read only alternating lines
        numList = map(int, line.split())
        print "Sample size:", len(numList), "Results:", sum(numList)

将该文件用作迭代器,然后使用以获取第二行:

from itertools import islice

with open("test_file1.txt", "r") as f:
   for line in islice(f, 1, None, 2):
       nums = [int(n) for n in line.split()]
       print 'Sample size: {}  Results: {}'.format(len(nums), sum(nums))
islice(f,1,None,2)
跳过第一行(
start=1
),然后迭代所有行(
stop=None
),每第二行返回一次(
step=2

这将适用于任何您抛出的文件大小;它不需要比内部迭代器缓冲区更多的内存

测试文件的输出:

Sample size: 3  Results: 46
Sample size: 5  Results: 214
Sample size: 4  Results: 86
Sample size: 2  Results: 102

像这样的东西怎么样,很像蟒蛇的伊姆霍:

with open('test.txt') as fh:
    for i, line in enumerate(fh):
        if i % 2:
            nums = map(int, line.split())
            print 'Sample size: %d, Results: %d' % (len(nums), sum(nums))
        elif line == '0':
            print 'End of experiment'

我不确定pythonic的人会怎么看,但我发现zip、map和reduce是一种非常方便的方法,可以以紧凑的方式实现这一点。但是,它可能有点模糊

with open("test.txt") as fd:                                                                                                           
   lines = [map(int, s.strip().split()) for s in fd.readlines()]                                                                      
   print "\n".join("Sample Size: %d \t Results: %d"%tuple(map(sum,(d[0],d[1])))                                                       
                   for d in zip(lines, lines[1:], range(len(lines)))                                                                  
                   if d[2] % 2 == 0)        

这是一个测试?还有一个代码回顾?使用
枚举
对行进行编号:
对于我来说,枚举(文件)中的行
@sr2222,是的,差不多(嗯,我凭空想出了一个测试问题示例)。我想比较一下我在没有Python知识的情况下与了解Python的人相比是如何做到这一点的。但我想知道:1)这有关系吗?2) 当内存不是问题时,
islice()
方法是否会更快?除非您绝对确定输入文件总是很小,否则最好避免一次将整个文件读入内存
islice()
完全用C实现,因此使用它的开销很小,最重要的是,它不会创建列表的副本<代码>行[1::2]必须首先创建一个包含所有奇数行的新列表,在文件的初始列表上增加50%的内存使用量,创建该列表也需要时间。不将整个文件读入mem是我使用简单解决方案试图避免的一件事,但是,只要您先检查文件大小,以确保它小于您的限制,这就可以了。我喜欢这个解决方案。使用内置(
enumerate()
)和简单构造(modulo),因此不需要了解
itertools.islice()
元组不需要。顺便说一句,您只需执行
(…)
即可。如果在其周围放置
(…)
,而不是转换为元组,它只会阻塞执行顺序,即。,作为括号。这将导致字符串格式错误,因为格式正在查找一个数字,而格式的输入将是一个列表:
“%d”%(映射(…)
将导致错误。itertools是第三方库还是内置于Python中?它是标准库;它与Python一起提供。我在回答中链接了该方法的文档。