Множество тестови случаи Stdin (Python)

Първият въпрос от тазгодишната фейсбук хакерска купа включваше следната форма:

 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], който изглежда труден за манипулиране.

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


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

По този начин четецът на данни не се интересува дали източникът е stdin, или файл, или каквото и да е, и можете да му подадете нещо, което премахва коментарите, ако е необходимо.

person DSM    schedule 25.11.2013