документация input
уже объясняет это:
Затем функция считывает строку из ввода, преобразует ее в строку (удаляя завершающую новую строку) и возвращает это.
Таким образом, ваш ui
является строкой, но ваши ключи в словаре являются числами. Поэтому он не может найти соответствия (потому что 2 != '2'
) и производит KeyError
.
Как уже упоминалось на @ Жан-FrançoisFabre вам нужно, чтобы преобразовать его в целое число:
ui = input('type a number from 1 to 303: ')
if len(ui) == 3:
ones_ui = int(ui[2])
tens_ui = int(ui[1])
hund_ui = int(ui[0])
elif len(ui) == 2:
ones_ui = int(ui[1])
tens_ui = int(ui[0])
elif len(ui) == 1:
ones_ui = int(ui[0])
else:
print('ups')
Или лучше обратить строку и затем отобразить каждую цифру в целое число:
ui = input('type a number from 1 to 303: ')
nums = list(map(int, ui[::-1]))
Для пример с входом 20
это возвращает [0, 2]
Если вы используете индексацию, то вам необходимо изменить ваши словари немного:
ones = {1 : "I", 2 : "II", 3 : "III", 4 : "IV", 5: "V", 6 : "VI", 7 : "VII", 8 : "VIII", 9 : "IX", 0: ""}
tens = {1 : "X", 2 : "XL", 3 : "XXX", 4 : "XL", 5 : "L", 6 : "LX", 7 : "LXX", 8 : "LXXX", 9 : "XC", 0: ""}
hun = {1 : "C", 2 : "CC", 3 : "CCC", 0: ""}
я добавил номер 0
ко всем из них, потому что тогда вам не нужно частный случай их, и вы можете просто пойти бросить эти:
print(''.join([dct[val] for val, dct in zip(nums, (ones, tens, hun))][::-1]))
[::-1]
снова меняет полученную строку перед присоединением всех частей.
Пример:
type a number from 1 to 303: 10
X
type a number from 1 to 303: 303
CCCIII
type a number from 1 to 303: 158
CLVIII
type a number from 1 to 303: 19
XIX
Код я использовал:
ones = {1 : "I", 2 : "II", 3 : "III", 4 : "IV", 5: "V", 6 : "VI", 7 : "VII", 8 : "VIII", 9 : "IX", 0: ""}
tens = {1 : "X", 2 : "XL", 3 : "XXX", 4 : "XL", 5 : "L", 6 : "LX", 7 : "LXX", 8 : "LXXX", 9 : "XC", 0: ""}
hun = {1 : "C", 2 : "CC", 3 : "CCC", 0: ""}
ui = input('type a number from 1 to 303: ')
nums = list(map(int, ui[::-1]))
print(''.join([dct[val] for val, dct in zip(nums, (ones, tens, hun))][::-1]))
Может быть, мы должны адаптировать «титул» вопрос - как он стал вводить в заблуждение, теперь ответ ребята очистили туман ;-) – Dilettant
@ Dilettant Done –