Несколько тестовых случаев Stdin (Python)

Первый вопрос хакерского кубка 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

Обычно при решении задач codeforces или 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], которым сложно манипулировать.

Как я могу прочитать несколько тестовых случаев со стандартного ввода? (даже общие ответы полезны, поскольку сам вопрос не такой уж конкретный)


person Noob Coder    schedule 25.11.2013    source источник


Ответы (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']]

Таким образом, считывателю данных все равно, является ли источником стандартный ввод, файл или что-то еще, и вы можете передать ему что-то, что при необходимости лишает комментариев.

person DSM    schedule 25.11.2013