Использование значений словаря Python для возврата ключа в качестве результата - PullRequest
0 голосов
/ 15 мая 2018

Я не уверен, почему этот код не работает для нескольких входов (из CodingBat, ссылка на вопрос: Exercise Link ). Подробности проблемы ниже, я мог бы, вероятно, сделать этот вопрос с if elif заявлениями, но я хочу использовать словари. Кроме того, я прочитал, что не рекомендуется получать значения ключа из словаря, как используется ниже. Но я буду признателен, если вы укажете на проблему в программе ниже

Вы едете слишком быстро, и полицейский останавливает вас. Напишите код для вычисления результата, закодированный как значение типа int: 0 = нет билета, 1 = маленький билет, 2 = большой билет. Если скорость равна 60 или меньше, результат равен 0. Если скорость находится между 61 и 80 включительно, результат равен 1. Если скорость равна 81 или больше, результат равен 2. Если это не ваш день рождения - в этот день ваш Скорость может быть на 5 выше во всех случаях.

  • поймал_скорость (60, Ложь) → 0
  • поймал_скорость (65, Ложь) → 1
  • поймал_скорость (65, правда) → 0
def caught_speeding(speed, is_birthday):
    Bir_dict = {0:speed<=60,1:61<=speed<=80,2:speed>=81}
    NoBir_dict = {0:speed<=65,1:66<=speed<=85,2:speed>=86}
    def getKey(dict,value):
        return [key for key in dict.keys() if (dict[key] == value)]
    if is_birthday:
        out1=getKey(Bir_dict,True)
        return out1[0]
    else:
        out2=getKey(NoBir_dict,True)
        return out2[0]

Программа не работает для

caught_speeding(65, False)
caught_speeding(65, True)

И работает на

caught_speeding(70, False)
caught_speeding(75, False)
caught_speeding(75, True)
caught_speeding(40, False)
caught_speeding(40, True)
caught_speeding(90, False)
caught_speeding(60, False)
caught_speeding(80, False)

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Разве проблема не в том, что словарь дня рождения имеет более высокие доступные значения?

Если у меня день рождения и мне 65 лет: Я не ожидал бы никакого билета. Однако, если вы сгенерируете словари и напечатаете их, вы увидите, что это не так:

def caught_speeding(speed, is_birthday):
    Bir_dict = {0:speed<=60,1:61<=speed<=80,2:speed>=81}
    print Bir_dict
    NoBir_dict = {0:speed<=65,1:66<=speed<=85,2:speed>=86}
    print NoBir_dict
    def getKey(dict,value):
        return [key for key in dict.keys() if (dict[key] == value)]
    if is_birthday:
        out1=getKey(Bir_dict,True)
        return out1[0]
    else:
        out2=getKey(NoBir_dict,True)
        return out2[0]

Выход:

{0: False, 1: True, 2: False}
{0: True, 1: False, 2: False}
0
{0: False, 1: True, 2: False}
{0: True, 1: False, 2: False}
1

Вы просто пересекаете значения в словаре объектов

0 голосов
/ 15 мая 2018

выглядит так, как будто вы смешали Bir_dict и NoBir_dict.Можете ли вы попробовать приведенный ниже код?

def caught_speeding(speed, is_birthday):
        Bir_dict = {0:speed<=65,1:66<=speed<=85,2:speed>=86}
        NoBir_dict = {0:speed<=60,1:61<=speed<=80,2:speed>=81}
        def getKey(dict,value):
            return [key for key in dict.keys() if (dict[key] == value)]
        if is_birthday:
            out1=getKey(Bir_dict,True)
            return out1[0]
        else:
            out2=getKey(NoBir_dict,True)
            return out2[0]

Несмотря на то, что он работает, я могу предложить альтернативный способ использования словарей: определения билетов не мешают друг другу, другими словами, может быть только один Trueутверждение в словаре.Таким образом, вы можете изменить свой код как:

def caught_speeding(speed, is_birthday):
        Bir_dict = {0:speed<=65,1:66<=speed<=85,2:speed>=86}
        NoBir_dict = {0:speed<=60,1:61<=speed<=80,2:speed>=81}
        def getKey(dict):
            return [key for key in dict.keys() if (dict[key] == True)]
        if is_birthday:
            out1=getKey(Bir_dict)
            return out1[0]
        else:
            out2=getKey(NoBir_dict)
            return out2[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...