0

私は大学院で受けなければならないプログラミングのプレースメント テストのために 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

ありがとう!

4

4 に答える 4

8

ファイルをイテレータとして使用iterators.islice()し、次を使用して 2 行おきに取得します。

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=None2 行おきに返します ( step=2)。

これは、どんなファイルサイズでも機能します。内部反復子バッファーが必要とする以上のメモリは必要ありません。

テスト ファイルの出力:

Sample size: 3  Results: 46
Sample size: 5  Results: 214
Sample size: 4  Results: 86
Sample size: 2  Results: 102
于 2013-04-15T19:01:22.327 に答える
4

あなたがすることができます:

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)
于 2013-04-15T18:59:14.637 に答える
2

このようなものはどうですか、かなりPythonic imho:

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'
于 2013-04-15T19:05:52.113 に答える