2015-09-08 3 views
0

Я начинаю код в python. Когда я должен был взять два входа от пользователя с промежутком между двумя входами, мой код был какПринимая n * n матричный ввод пользователем в python

min, p = input().split(" ") 
min=int(min) 
p=float(p) 

который работал нормально. В другой такой проблеме я должен взять * n-матрицу в качестве пользовательского ввода, которую я объявила как arr=[[0 for i in range(n)] for j in range(n)] . Печать arr дает мелкую матрицу (хотя бы в одной строке), но я должен заменить каждый элемент «0» с пользовательским вводом, поэтому Я использую вложенные петли как

for i in range(0,n) 
    for j in range(0,n) 
     arr[i][j]=input() 

это также отлично работает, но с нажатием кнопки «ввести» после каждого элемента. В этой конкретной задаче пользователь вводит элементы в одну строку в пространстве вместо нажатия кнопки «Ввод». Я хотел бы знать, как использовать split в этом случае, как в первом случае выше, имея в виду, что матрица n * n, где мы не знаем, что такое n. Я предпочитаю избегать использования numpy, являющегося новичком с python.

+0

Что останавливает вас от чтения входной линии, разделив ее в список, проверяя количество элементов и возможное преобразование в числа и копирование их в вашу матрицу как одну строку? – Youka

ответ

0

Попробуйте что-то вроде этого, вместо установки матрицы по одному, используя существующий список (ы):

# take input from user in one row 
nn_matrix = raw_input().split() 
total_cells = len(nn_matrix) 
# calculate 'n' 
row_cells = int(total_cells**0.5) 
# calculate rows 
matrix = [nn_matrix[i:i+row_cells] for i in xrange(0, total_cells, row_cells)] 

Пример:

>>> nn_matrix = raw_input().split() 
1 2 3 4 5 6 7 8 9 
>>> total_cells = len(nn_matrix) 
>>> row_cells = int(total_cells**0.5) 
>>> matrix = [nn_matrix[i:i+row_cells] for i in xrange(0, total_cells, row_cells)] 
>>> matrix 
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']] 
>>> 
0
>>> import math 
>>> line = ' '.join(map(str, range(4*4))) # Take input from user 
'0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15' 
>>> items = map(int, line.split()) # convert str to int 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
>>> n = int(math.sqrt(len(items))) # len(items) should be n**2 
4 
>>> matrix = [ items[i*n:(i+1)*n] for i in range(n) ] 
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]] 
0

Ну, если матрица N * N, что означает, что с первой строкой ввода вы знаете количество входных строк (и нет, невозможно, чтобы input() не заканчивалось нажатием клавиши ввода). Так что вам нужно что-то вроде этого:

arr = [] 
arr.append(input().split()) 
for x in range(len(arr[0]) - 1): 
    arr.append(input().split()) 

Я использовал range(len(arr[0]) - 1) так входы остальные линии (потому что ширина матрицы и высота одинакова и одна первая линия уже прочитал от входа).

Также я использовал .split() без параметра " " как параметр, потому что это параметр по умолчанию.

0

Вы можете попробовать этот простой подход (нажмите клавишу ВВОД после каждой цифры ... отлично работает) ::

m1=[[0,0,0],[0,0,0],[0,0,0]] 
for x in range (0,3): 
    for y in range (0,3): 
     m1[x][y]=input() 
print (m1) 
+0

, и если вы хотите ввести матрицу 1000 * 1000, что вы должны делать? –

+0

просто измените значения в диапазоне (для циклов) для «строк для цикла» и «столбца для цикла»: «для x в диапазоне (0,1000)» и «для y в диапазоне (0,1000)» –

+0

, поэтому описать это в своем ответе –

Смежные вопросы