1

私はそれが非常に基本的な質問であることを知っていますが、私はPython環境の初心者でもあります. 入力テストケースを読む必要がある最初のプログラム(データ構造の問題)を書いています。

入力:

The first line contains the number of test cases T. T test cases follow. 
The first line for each case contains N, the number of elements to be sorted. 
The next line contains N integers a[1],a[2]...,a[N].

制約:

1 <= T <= 5
1 <= N <= 100000
1 <= a[i] <= 1000000

サンプル入力:

2
5
1 1 1 2 2
5
2 1 3 1 2

if-elseファイルから上記の入力を読み取るために次のプログラムを作成しましたが、これは最善の方法ではないと確信していforますinputs

sample = open('sample.txt')
first = sample.readline()
if len(first) > 5 or len(first) <1:
    print "Not correct input";
else:
    test = sample.readline
    for x in range(0,len(first)):
        second = sample.readline()
        if len(second) >100000 or len(second) < 1:
            print "wrong input";
        else:
            third = list()
            for y in range(0, len(third)):
                third.append(sample.readline()[:1])
        method_test(third)  #calling a method for each sample input

最善の解決策を教えてください。

4

3 に答える 3

3

これはそれを行う必要があります:

with open('sample.txt') as sample:
    num_testcases = int(sample.readline())
    assert 1 <= num_testcases <= 5
    for testcase in range(num_testcases):
        num_elems = int(sample.readline())
        assert 1 <= num_elems <= 10000
        elems = map(int, sample.readline().split())
        assert len(elems) == num_elems
        assert all(1 <= elem <= 100000 for elem in elems)
        method_test(elems)

編集:有効性チェックを追加しました。

于 2012-11-04T19:48:36.663 に答える
1

このようなもの:

cycle()最初の行の後の代替行のみを読み取るために使用します。サイクルのサイズは、の値の2倍になりますT

 from itertools import islice,cycle
 with open("data1.txt") as f:
    T = int(f.readline())
    if T != 0:
            cyc=islice(cycle((False,True)),T*2) 
            for x in cyc:
                if x or not f.readline():
                    print map(int,f.readline().split())

出力:

[1, 1, 1, 2, 2]
[2, 1, 3, 1, 2]
于 2012-11-04T20:09:00.113 に答える
1

まず。len(x)入力の長さがわかるので、入力行が「9」の場合len(line)は1になります。入力行が「999」の場合、 3 になります。入力ファイルから数値を正しく読み取るには、len(line)を使用する必要があります。int(line)

プログラムの残りの部分のロジックは正しくないように見えます。たとえば、最初の行 (テストの数) を読み取っていて、この数をループ処理しています (これは問題ありません)。ただし、外部の値の数を読み取っています。このループは間違った順序です。

さまざまな値を読みながら印刷することを強くお勧めします。これにより、何が起こっているのかを追跡し、プログラムをより簡単にデバッグできます。

最後に、次のことを行うと:

        third = list()
        for y in range(0, len(third)):...

空のリストを作成し、list()0 からリストの長さ (これもゼロ) までループします。したがって、ループは実際には何もしません。

于 2012-11-04T19:44:07.503 に答える