2015-12-17 3 views
0

Вот код, который я написал до сих пор:словаря в Python - проверка ключа

def Ordinal(check): 
    data={1:"First", 2:"Second", 3:"Third", 4:"Fourth", 5:"Fifth", 6:"Sixth", 7:"Seventh", 8:"Eighth", 9:"Ninth", 10:"Tenth", 11:"Eleventh", 12:"Twelfth"} 

    if check in dict.keys: 
     return dict.get(check) 
    else: 
     return"" 
def main(): 
    Num=input("Enter a number (1-12) to get its ordinal: ") 
    print ("The ordinal is", Ordinal(Num)) 
main()   

Программа предполагает, чтобы получить число от 1 до 12 от пользователя, а затем распечатать его порядковый номер. У меня возникли проблемы с использованием ввода и проверки, чтобы проверить, является ли он ключом, а затем возвращает его значение в качестве оператора печати в основной функции. Ошибка связана с оператором if.

+1

Боковое примечание: было бы лучше сделать 'dict' вне' Ordinal'; как есть, он перестраивает каждый вызов, что довольно глупо. Для одного вызова не имеет значения, но я предполагаю, что код в какой-то момент увеличится? – ShadowRanger

+0

Мы любим следы стека здесь. _ «Ошибка связана с оператором if». _ Является неопределенным по сравнению с деталью, которую дает python. – tdelaney

ответ

1

Ваша проблема с if check in data.keys:, потому что:

data.keys является метод: <built-in method keys of dict object at 0x10b989280>

Вы должны вызвать метод data.keys() который возвращает [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

Или вы можете сделать:

def Ordinal(check): 
    data={1:"First", 2:"Second", 3:"Third", 4:"Fourth", 5:"Fifth", 6:"Sixth", 7:"Seventh", 8:"Eighth", 9:"Ninth", 10:"Tenth", 11:"Eleventh", 12:"Twelfth"} 

    if check in data: 
     return data.get(check) 
    else: 
     return"" 
def main(): 
    Num=input("Enter a number (1-12) to get its ordinal: ") 
    print ("The ordinal is", Ordinal(Num)) 
main() 

Или, как отметил @astrosyam, используя data.get(int(check), "") более чистый способ.

+0

Спасибо, что работает jianweichuah! – 0ceanwaves

3

Попробуйте это ...

def Ordinal(check): 
    data={1:"First", 2:"Second", 3:"Third", 4:"Fourth", 5:"Fifth", 6:"Sixth", 7:"Seventh", 8:"Eighth", 9:"Ninth", 10:"Tenth", 11:"Eleventh", 12:"Twelfth"} 
    return data.get(int(check), "") 

def main(): 
    Num=input("Enter a number (1-12) to get its ordinal: ") 
    print ("The ordinal is", Ordinal(Num)) 
main() 

Условный чек не является необходимым, так как dict.get может возвращать значение по умолчанию.

0

Чтобы добавить ответ Bryan Oakley в вы можете сделать следующее: что я добавил Eval в строку ввода

def Ordinal(check): 
    data={1:"First", 2:"Second", 3:"Third", 4:"Fourth", 5:"Fifth", 6:"Sixth", 7:"Seventh", 8:"Eighth", 9:"Ninth", 10:"Tenth", 11:"Eleventh", 12:"Twelfth"} 

    if check in data: 
     return data.get(check) 
    else: 
     return"" 
def main(): 
    Num=eval(input("Enter a number (1-12) to get its ordinal: ")) #notice eval here! 
    print ("The ordinal is", Ordinal(Num)) 
main() 

Примечание.

+1

И это дети, как вы добавляете дыры безопасности специально. В его случае int() был бы подходящим как для проверки ввода, так и для обеспечения типа данных, в то время как eval открывает возможность червей, допускающих произвольное выполнение чего-либо. – Zart

+0

точно, какую ошибку вы беспокоитесь об eval? – jfish003

+0

eval() сам по себе не опасен, но он становится единым в сочетании с ненадежным вводом и повышением привилегий. – Zart

0

Возможно, что-то вроде этого? Не печатайте вывод, если они вводят неверный ключ.

data = { 
    1: "First", 2: "Second", 3: "Third", 4: "Fourth", 5: "Fifth", 
    6: "Sixth", 7: "Seventh", 8: "Eighth", 9: "Ninth", 10: "Tenth", 
    11: "Eleventh", 12: "Twelfth"} 


def Ordinal(check): 
    return data[check] 


def main(): 
    Num = input("Enter a number (1-12) to get its ordinal: ") 

    try: 
     print ("The ordinal is {}".format(Ordinal(int(Num)))) 
    except ValueError: 
     print("didnt enter a valid integer") 
    except KeyError: 
     print("Not number between 1-12") 

main() 

Если с помощью Python 2.x использовать raw_input вместо input.

Смежные вопросы