#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)