Как читать "n" строк одновременно из стандартного ввода? - PullRequest
0 голосов
/ 29 октября 2019

Предположим, что в stdin есть следующие записи:

2  
a     
b     
3
d   
e   
f   

Теперь я хотел бы сначала прочитать число, используя n= sys.stdin.readline(), а затем прочитать следующие строки n, используя функцию ReadNLines(n), вlist.

Итак, ожидаемый результат:

List1 = ['a','b']  
List2 = ['d','e','f']

Вот что я пробовал. И я ищу лучшее время для синхронизации.

import sys
def ReadNLines(n):
    List =[]
    for line in range(n):
        List.append(sys.stdin.readline())
    return List

if __name__ == "__main__":
    n = sys.stdin.readline()
    List1 = ReadNLines(n)
    n = sys.stdin.readline()
    List2 = ReadNLines(n)

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Я думаю, что это то, что вы хотите:

import sys

def read_n_lines(n):
    return [sys.stdin.readline().rstrip() for _ in range(n)]

if __name__ == "__main__":
    count = 0
    while True:
        n = sys.stdin.readline().rstrip()
        if not n:  # Blank line entered?
            break  # Quit.
        n = int(n)
        result = read_n_lines(n)
        count += 1
        print(f'List{count} = {result}')
    print('done')

Пробный прогон - Нажата клавиша , чтобы завершить каждую строку ввода:

2
a
b
List1 = ['a', 'b']
3
d
e
f
List2 = ['d', 'e', 'f']

done
0 голосов
/ 29 октября 2019

Вам необходимо удалить символ новой строки, который sys.stdin.readline() включает в результат. И вам нужно преобразовать n в целое число.

import sys
def ReadNLines(n):
    List =[]
    for _ in range(n):
        List.append(sys.stdin.readline().strip())

if __name__ == "__main__":
    n = int(sys.stdin.readline().strip())
    ReadNLines(n)
    n = int(sys.stdin.readline().strip())
    ReadNLines(n)

Поскольку вы никогда не используете переменную line, принято использовать _ в качестве фиктивной переменной. Вы также можете преобразовать функцию в понимание списка:

def readNLines(n):
    return [sys.stdin.readline().strip() for _ in range(n)]
...