2016-03-18 15 views
0

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

x=input("enter the matrix?") 
print(read_matrix(x)) 

def read_matrix(matrix): 
    list_of_lists = [] 
    for line in matrix: 
     new_list = [int(elem) for elem in line.split()] 
     list_of_lists.append(new_list) 
    return list_of_lists 
+0

'для строки в матрице:' будет присваивать 'line' каждому элементу в' matrix'. Так как 'matrix' передается как строка, каждый символ будет' line'. – zondo

+0

'input' читается до новой строки. Попробуйте добавить «raw_input» в read_matrix в цикле while и перерыв, когда введенная строка пуста или недействительна. –

+2

комментарий @YakymPirozhenko действителен только для python 2, потому что 3.x 'input' прав - нет' raw_input', действительно, поскольку unicode имеет значение по умолчанию – Ilja

ответ

2

Предполагая, что вы используете Python 2.7, проблема заключается в том, что вы используете input для обработки ввода, введенного пользователем. Действительно, если вы посмотрите на соответствующую документацию (https://docs.python.org/2/library/functions.html#input), вы увидите, что в основном input соответствует eval(raw_input()), что означает, что аргумент выражения анализируется и оценивается как выражение Python. Если вы хотите прочитать стандартный ввод как строку, вместо этого вы должны использовать raw_input.

Если вы используете python 3, то input в порядке.

Обратите внимание, что вы должны форматировать входную строку таким образом, чтобы read_matrix мог распознавать элементы в одной и той же строке и добавлять новую строку.

Одно из возможных решений (которое работает с python 2.7), сохраняя вашу структуру кода и предполагая, что формат ввода имеет номера в одной и той же строке, разделенные пробелом, и строки, разделенные символом ';' (Например, 1 2 3, 4 5 6, 7 8 9), является:

def parse_numbers_list(formatted_string): 
    list_of_lists = [map(int, row.split()) for row in formatted_string.split(';')] 

    return list_of_lists 

x = raw_input("enter the list of lists of numbers?") 
print(parse_numbers_list(x)) 

Для Python 3, аналогично:

def parse_numbers_list(formatted_string): 
    list_of_lists = [list(map(int, row.split())) for row in formatted_string.split(';')] 

    return list_of_lists 

x = input("enter the list of lists of numbers?") 
print(parse_numbers_list(x)) 

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

Кроме того, полное решение должно включать проверку правильности форматирования входной строки.

Существует, конечно, множество других способов реализации кода для чтения матрицы со стандартного ввода, в том числе с использованием внешних библиотек, например, numpy, но я думаю, что, изучая Python, хорошо, что вы начинаете с основами.

+0

Большое спасибо, что я всегда работал со входами из файла, но теперь я застрял со стандартным вводом, а raw_input не работает с моим 3.5 python. – jason

+0

NameError: имя 'raw_input' не определено – jason

+0

Это 'raw_input (eval()) 'или' eval (raw_input()) '??? имейте это в виду. Обратите внимание, что OP использует Python 3.x, который _only_ имеет 'input' с семантикой' raw_input' Python 2.x. – gboffi

0

У вашего кода есть две проблемы. Во-первых, у вас нет способа рассказать ячейки отдельно. Если кто-то входит в 112 для первой строки, вы интерпретируете его как [1], [1], [2], когда они могут означать любое из нескольких вещей. Для фиксации этой линии 4 можно изменить на

new_list = [int(elem) for elem in line.split(',')] 

Это вызовет раздельное разделение ячеек запятыми. Вторая проблема заключается в том, что нажатие enter указывает интерпретатору, что вы сделали ввод ввода. Для этого есть два решения. У вас могут быть пользовательские размеры входных матриц и использовать цикл for, чтобы они могли вводить каждую строку, или вы могли бы использовать синтаксис Matlab, где вводится матрица 2x2 как [[a, b], [c, d]].

+0

да, я хочу, чтобы пользователи вводили размер матрицы в первой строке и ее всегда квадратную матрицу – jason

0

Из вашего примера кода кажется, что вы используете список списков для агрегирования ваших данных ... Бесконечный цикл с чем-то, что можно разбить, может создать такую ​​структуру данных --- разбить входной цикл I Я использовал предложение try-except, потому что мне кажется наиболее естественным использовать EOF для обозначения конца ввода, но вы можете использовать любой другой возможный механизм.

In [14]: def read_matrix(): 
    print('Input 1 row per line, with numbers separated by spaces.\n', 
      'Use a C-d to stop input.') 
    matrix = [] 
    while True: 
     try: 
      matrix.append([int(n) for n in input().split()]) 
     except EOFError:          
      return matrix 
    ....:   

In [15]: read_matrix() 
Input 1 row per line, with numbers separated by spaces. 
Use a C-d to stop input. 
1 2 3 
4 5 6 
Out[15]: [[1, 2, 3], [4, 5, 6]] 

, конечно, я напечатал C-D (на новой линии, которая была съедена переводчика), чтобы остановить цикл ввода.

Функция слишком компактен, вы можете предпочесть, чтобы развернуть элементы списка понимания и, возможно, добавить некоторые проверки целостности (число столбцов может быть?) Перед обновлением matrix

In [18]: def read_matrix(nc): 
    print('Input 1 row per line, with %d numbers separated by spaces.\n'%nc, 
      'Use a C-d to stop input.') 
    matrix = [] 
    while True: 
     try: 
      line = input() 
      numbers = [int(n) for n in line.split()] 
      if not len(numbers) == nc: 
       print('Wrong number of columns, repeat this line') 
       continue 
      matrix.append(numbers) 
     except EOFError: 
      return matrix 
    ....:   

In [19]: read_matrix(3) 
Input 1 row per line, with 3 numbers separated by spaces. 
Use a C-d to stop input. 
1 2 3 
4 5 6 7 
Wrong number of columns, repeat this line 
4 5 6 
Out[19]: [[1, 2, 3], [4, 5, 6]] 
Смежные вопросы