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

首先。len(x)将告诉您输入的长度,因此如果您的输入行是“9”,则为len(line)1;如果您的输入行是“999”,则为len(line)3。您需要使用int(line)从输入文件中正确读取数字。

程序其余部分的逻辑看起来不正确 - 例如,您正在读取第一行(测试数),然后循环这个数字(这很好) - 但您正在读取外部值的数量这个循环,这是错误的顺序。

我强烈建议您在阅读时打印出各种值,这样您就可以了解正在发生的事情,并更轻松地调试您的程序。

最后,当您执行以下操作时:

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

您正在创建一个空列表list(),然后从 0 循环到列表的长度(也为零)。所以循环实际上不会做任何事情。

于 2012-11-04T19:44:07.503 回答
1

像这样的东西:

用于cycle()只读取第一行之后的交替行,并且循环的大小将是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 回答