今年的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)


操纵其余部分。如果我针对此问题执行了类似的操作(将int替换为str),我将得到一个像[3,4,data,2,data,3,data]这样的数组,这似乎很难操作。

如何从stdin中读取多个测试用例? (因为问题本身不是那么具体,所以一般答案也很有用)

最佳答案

我倾向于将其包装在生成器中。例如:

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']]


这样,数据读取器就不在乎源是stdin,文件还是其他文件,并且可以在必要时传递一些除去注释的内容。

09-11 17:34