Как изменить матрицу с помощью пользовательских данных в цикле while и прервать, когда пользователь вводит строку?

#python #python-3.x #loops #input #while-loop

#python #python-3.x #циклы #ввод #цикл while

Вопрос:

Я пытаюсь написать программу, которая изменяет матрицу с учетом пользовательских вводимых данных в цикле 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
  

Комментарии:

1. if type(y)==int всегда произойдет сбой, потому что пользовательский ввод всегда является строкой. Вам нужен try / except , чтобы посмотреть, можно ли преобразовать входную строку

2. С помощью try / except этот комментарий не будет много значить, но вы также должны использовать isinstance для проверки типов

Ответ №1:

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

Комментарии:

1. Итак, как должен выглядеть их подход?

2. @roganjosh — Я не уверен, что понял ваш вопрос. Пожалуйста, объясните.

3. Что ж, если вы поменяетесь местами, и это был ответ на ваш вопрос, как бы вы это реализовали? Это ничего не говорит о том, каким должен быть фактический подход

4. Понял .. Я думал, решение очевидно — попробуйте преобразовать в int и, если это не удается, попросите пользователя вставить ввод снова.

5. Решение может быть очевидным для вас, но не обязательно, если вы ставите себя на место операционной системы 🙂

Ответ №2:

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

Прежде всего, вы должны преобразовать входные данные в индексы списка, но только если первый ввод (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())
  

Ответ №3:

Это помогло бы 🙂 Небольшое изменение порядка и преобразование типов во время индексации вместо функции 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)