2017-01-27 5 views
1

У меня есть этот кодКак вернуть значение ключа для нескольких словарей?

ones = {1 : "I", 2 : "II", 3 : "III", 4 : "IV", 5: "V", 6 : "VI",\ 
     7 : "VII", 8 : "VIII", 9 : "IX"} 
tens = {10 : "X", 20 : "XL", 30 : "XXX", 40 : "XL", 50 : "L",\ 
     60 : "LX", 70 : "LXX", 80 : "LXXX", 90 : "XC"} 
hun = {100 : "C", 200 : "CC", 300 : "CCC"} 

ui = input('type a number from 1 to 303: ') 
k = ui 
print(ones[k]) 

Я пытаюсь, чтобы пользовательский ввод числа от 1 до 399.

, когда я использовал ones[ui], я получил

KeyError '2'

2 - номер, который я сделал. поэтому я передал вход ui в другую переменную, называемую k, но у меня такая же проблема.

в живой среде python (idle), когда я пишу ones[2], я получаю "II" вместо ошибки выше.

Итак, в чем проблема в точности и как я могу ее решить?

+1

Может быть, мы должны адаптировать «титул» вопрос - как он стал вводить в заблуждение, теперь ответ ребята очистили туман ;-) – Dilettant

+1

@ Dilettant Done –

ответ

7

Это потому, что ваш вход string, а не int (с использованием python 3), так что вы на самом деле делаете ones["2"], который терпит неудачу.

ui = int(input('type a number from 1 to 303: ')) 

исправит это.

Обратите внимание, что если пользователь вводит «303», вы также получите ключевую ошибку. Так что лучше делать print(ones[ui%10]) для примера (вы также должны проверить! = 0, так как римские цифры не поддерживают :))

Помимо 20 : "XL", должна быть 20 : "XX",

Мое затруднительное предложением с полной реализацией номер сборки (также работает с питоном 2):

ones = {1 : "I", 2 : "II", 3 : "III", 4 : "IV", 5: "V", 6 : "VI", 
     7 : "VII", 8 : "VIII", 9 : "IX",0:""} 
tens = {10 : "X", 20 : "XX", 30 : "XXX", 40 : "XL", 50 : "L", 
     60 : "LX", 70 : "LXX", 80 : "LXXX", 90 : "XC",0:""} 
hun = {100 : "C", 200 : "CC", 300 : "CCC",0:""} 

ui = int(input('type a number from 1 to 303: ')) 
if 0 < ui < 304: 
    units = ui%10 
    tenths = (ui-units)%100 
    hundreds = (ui-tenths-units) 

    string = "".join([d[v] for d,v in zip((hun,tens,ones),(hundreds,tenths,units))]) 
    print(string) 
+0

Вам также нужно добавить '0: ''' для 'ones', иначе' 10' не работает :-) Также вам не нужна обратная косая черта для line- перерывы в словарях. – MSeifert

4

документация 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])) 
+0

вам нужно проверить длину до доступа к 'ui [2]' или даже проверить, является ли это _is_ целым числом. +1 для индексации. –

+0

@ Jean-FrançoisFabre Еще раз спасибо. – MSeifert

+0

, конечно, все еще есть случай «0», который необработан в римских цифрах, просто педантичен :) –

1
ones = {1 : "I", 2 : "II", 3 : "III", 4 : "IV", 5: "V", 6 : "VI",\ 
     7 : "VII", 8 : "VIII", 9 : "IX"} 
tens = {10 : "X", 20 : "XX", 30 : "XXX", 40 : "XL", 50 : "L",\ 
     60 : "LX", 70 : "LXX", 80 : "LXXX", 90 : "XC",0:""} 
hun = {100 : "C", 200 : "CC", 300 : "CCC",0:""} 

MAPPING = {3:[hun,tens,ones], 
      2:[tens, ones], 
      1:[ones]} 

rr = 304 
_input = str(input('type a number from 1 to {0}: '.format(rr))) 
_out = [] 

#check range and schema 
if 0<int(_input)<rr and MAPPING.has_key(len(_input)): 
    for n,sub_dict in enumerate(MAPPING[len(_input)]): 
    #ignore zero 
    if int(_input[n]): 
     # go by mapping values, based on input len 
     _out.append([sub_dict[x] for x in sub_dict.keys() if _input[n] in str(x)]) 

print _out 


>>>type a number from 1 to 304: 201 
>>>[['CC'], ['I']] 

>>>type a number from 1 to 304: 74 
>>>[['LXX'], ['IV']] 

>>>type a number from 1 to 304: 303 
>>>[['CCC'], ['III']] 

>>>type a number from 1 to 304: 123 
>>>[['C'], ['XX'], ['III']] 
Смежные вопросы