Как изменить матрицу с пользовательским вводом в цикле while и разорвать, когда пользователь вводит строку? - PullRequest
1 голос
/ 24 марта 2019

Я пытаюсь написать программу, которая изменяет матрицу, заданную пользователем, в цикле while и продолжает получать входные данные до тех пор, пока пользователь не введет строку.

По сути, это моя конечная цель:

for a matrix i=[[0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]]
user input:
2
3
3
3
t

for user inputs, the first integer specifies the row, and the next one following it specifies the column.

expected output: i=[[0,0,0,0,0], [0,0,1,0,0], [0,0,1,0,0], [0,0,0,0,0]]

Я пробовал несколько способов, но мне все еще не удалось получить то, что я хочу:

while True:
    x=input()   
    y=input()
    if type(y)==int and type(x)==int:
     i[x][y]=1
    else:
      break
print(i)

This outputs original configuartion [[0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]]

Я также попробовал этот:

while True:
    x=input()
    y=int(input())
    i[x][y]=1
    if x=="t":
        break

print(i)

outputs TypeError: list indices must be integers or slices, not str

Ответы [ 3 ]

0 голосов
/ 24 марта 2019

Здесь вы столкнулись с несколькими проблемами.

Прежде всего, вы должны преобразовать входные данные в индексы списка, но только если первый вход (x) не равен 't'.Я добавил это сравнение в начале цикла, поэтому мы завершаем цикл, не беспокоясь о y.

Затем оба входа x и y преобразуются в int (используя int ()), и мы вычитаем 1от каждого из них, потому что я понимаю, что пользователь должен вводить «естественные» матричные индексы (начиная с 1) вместо индексов Python (начиная с нуля).

mat = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

while True:
    x = input()
    if x is 't':
        break;
    else:
        xi = int(x) - 1
        yi = int(input()) - 1

    mat[xi][yi] = 1

print(mat)

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

Примером функции проверки ввода будет следующий:

def check_x(x_local):
    if len(x_local) is not 1:
        raise ValueError()
    return x_local

, которая вызовет исключение, если введенный ввод былничего кроме одного символа.Затем вы бы назвали его в своей основной программе следующим образом:

x = check_x(input())
0 голосов
/ 24 марта 2019

Это бы сработало :) Небольшая переупорядоченность и преобразование типов во время индексации, а не on input (), также исправляет множество других проблем, возникающих при игре

i=[[0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]]


while True:

    x=input()
    y=input()

    """ As we're unsure when we'd like to break, lets assume t could be in x or y """
    if x == "t" or y == "t":
        break
    """ Convert both inputs to ints """
    else:
      i[int(x)][int(y)]=1

print(i)
0 голосов
/ 24 марта 2019

input () возвращает 'str', так что i [x] поднимает 'индексы списка должны быть целыми или кусочками, а не str'

...