Как сохранить многострочный ввод в список (python)

Как бы вы сохранили многострочный ввод в список?

Например:

3
2 1
1 1 0
2 1 1
4 3 0 1 2
2 
1 2
1 3

Как бы я взял этот ввод и сохранил его в виде списка, например:

examList = [
      [3],
      [2,1],
      [1,1,0], 
      [2,1,1], 
      [4,3,0,1,2], 
      [2],
      [1,2],
      [1,3]
]

Как вы определяете ввод конечного пользователя, если нет конкретных индикаторов?


person William Merritt    schedule 25.02.2018    source источник


Ответы (3)


Продолжайте вызывать функцию input(), пока строка, которую она считывает, не станет пустой. Используйте метод .split (без аргументов = пробел в качестве разделителя). Используйте list-comp, чтобы преобразовать каждый string в int и добавить его к вашему examList.

Вот код:

examList = []
i = input()
while i != '':
    examList.append([int(s) for s in i.split()])
    i = input()

И с вашим вводом examList это:

[[3], [2, 1], [1, 1, 0], [2, 1, 1], [4, 3, 0, 1, 2], [2], [1, 2], [1, 3]]

Вышеупомянутый метод предназначен для Python3, который позволяет вам вызвать input() и ничего не вводить (поэтому мы используем это как сигнал, чтобы проверить, что мы сделали - i != '').

Однако из документов мы видим, что в Python2 , пустая запись в input() вызывает ошибку EOF. Чтобы обойти это, я думаю, мы могли бы просто сделать так, чтобы многострочный ввод заканчивался при вводе строки, такой как: END. Это означает, что вы должны остановить запись строкой 'END':

examList = []
i = raw_input()
while i != 'END':
    examList.append([int(s) for s in i.split()])
    i = raw_input()

Обратите внимание, что я использовал raw_input as, чтобы не выполнять преобразование типов.

который работает так же, как указано выше.

person Joe Iddon    schedule 25.02.2018
comment
@HuStmpHrrr Python2 настолько устарел, что я сомневаюсь, что они его используют, и быстрый просмотр других вопросов показывает, что на самом деле они используют Python3 - person Joe Iddon; 25.02.2018
comment
@Joelddon ваш код привел к ошибке EOFError: EOF при чтении строки при запуске. Как бы вы определили конец ввода? - person William Merritt; 25.02.2018
comment
@WilliamMerritt Я обновлю ответ, вы должны быть на Python2, я прав? - person Joe Iddon; 25.02.2018
comment
@Joelddon Я использую Python3. - person William Merritt; 25.02.2018
comment
@Joelddon, у этого кода все еще есть проблемы при получении последнего элемента ввода (в данном случае «1 3»). Я не понимаю, как while i != '' успешно выполняет итерацию до конца ввода. Все еще получаю ошибки EOF. - person William Merritt; 25.02.2018
comment
Таким образом, отдельный оператор input() читает одну строку. Для многострочных входных данных нам нужно снова и снова вызывать input(). Однако нам нужно знать, когда прекратить вызывать это, иначе программа никогда не прекратит многострочный ввод! Итак, нам нужен сигнал или специальная входная линия, которая сообщает нам, когда выйти из нашего бесконечного цикла while. Это может быть что угодно. В первом фрагменте я использовал пустую строку (''), а во втором — строку: 'END'. Этот метод определенно работает, и я его тестирую, поэтому не знаю, что у вас не так. Пожалуйста, уточните ошибки. - person Joe Iddon; 25.02.2018

Вы можете использовать sys.stdin.readlines().

Например, начните с

import sys
user_input = sys.stdin.readlines()

в этот момент значение user_input должно быть

['3\n', '2 1\n', '1 1 0\n', '2 1 1\n', '4 3 0 1 2\n', '2\n', '1 2\n', '1 3']

затем вы сможете получить желаемый результат, выполнив следующую обработку

examList = []

for input_string in user_input:
   examList.append([int(value) for value in input_string.split()])

Здесь мы делаем итерацию по user_input. Для каждого input_string мы split() слов преобразовываем их в int и помещаем обратно в новый список. Затем новый список будет добавлен в examList.

person liofpi    schedule 27.06.2020

Вот эффективный однострочник:

>>> inp = '''3
2 1
1 1 0
2 1 1
4 3 0 1 2
2 
1 2
1 3'''
>>> [i.split() for i in inp.split('\n')]

[['3'], ['2', '1'], ['1', '1', '0'], ['2', '1', '1'], ['4', '3', '0', '1', '2'], ['2'], ['1', '2'], ['1', '3']]
person Mike Peder    schedule 25.02.2018