多个测试用例Stdin(Python)

时间:2013-11-25 03:43:05

标签: python stdout stdin testcase

今年的facebook黑客杯的第一个问题输入了以下形式:

 3 #number of test cases
 4 #number of rows of test case 1 
 . . . x
 . . x x
 . . x x
 . . . x
 2 #number of rows of test case 2
 . . x x
 . . x x
 3 #number of rows of test case 3 
 x x . .
 x x . .
 . . . x

通常在执行代码强制问题或topcoder时,您不必相互输入5个测试用例,只需将其设置为一个,然后通过20-25个测试用例运行它。

我在努力操纵这些数据以使其可用时遇到了很多困难,并且想知道如何做到这一点。

例如,如果它只是

 5
 2 3 4 5 6

我可以使用input()来获取第一个数字,

import sys
data = []
for line in sys.stdin:
    y = [int(x) for x in line.split()]
    data.append(y)

操纵其余部分。如果我为这个问题做了类似的事情(用str替换int),我最终得到一个像[3,4,数据,2,数据,3,数据]这样的数组,这似乎很难操作。

如何从stdin读取多个测试用例? (即使一般答案也很有用,因为问题本身并不具体)

1 个答案:

答案 0 :(得分:1)

我倾向于将它包装在发电机中。例如:

import sys

def read_data(source):
    N = int(next(source))
    for case in range(N):
        num_rows = int(next(source))
        rows = [next(source).split() for i in range(num_rows)]
        yield rows

for case in read_data(sys.stdin):
    print case

产生

dsm@notebook:~/coding$ cat source.txt | python getdata.py 
[['.', '.', '.', 'x'], ['.', '.', 'x', 'x'], ['.', '.', 'x', 'x'], ['.', '.', '.', 'x']]
[['.', '.', 'x', 'x'], ['.', '.', 'x', 'x']]
[['x', 'x', '.', '.'], ['x', 'x', '.', '.'], ['.', '.', '.', 'x']]

这样,数据阅读器并不关心源是标准输入,文件还是其他任何东西,如果有必要,你可以传递一些剥离评论的内容。