Python -Nested Dictionary - значения для передачи в формулу и вычисления результата - PullRequest
0 голосов
/ 20 января 2020

Я пытался решить эту проблему, но иду по кругу. У меня есть два вопроса относительно следующей проблемы кодирования вложенного словаря.

1) Расчет килоджоулей - я хотел вычислить килоджоули каждой диеты, основываясь на значениях из вложенного словаря diets_data. Однако, когда я вручную проверяю ответ, я обнаруживаю, что написанная мной формула не дает мне правильного ответа.

def diet_choose_diet():
    diets_data = {
            'Normal': {'protein': 32.50, 'carbohydrates': 60.00, 'fat': 40.86},
            'Oncology': {'protein': 35.00, 'carbohydrates': 52.50, 'fat': 37.63},
            'Cardiology': {'protein': 32.50, 'carbohydrates': 30.00, 'fat': 26.88},
            'Diabetes': {'protein': 20.00, 'carbohydrates': 27.50, 'fat': 27.95},
            'Kidney': {'protein': 15.00, 'carbohydrates': 55.00, 'fat': 23.65}}

    # ****************** Normal Diet *****************************
    for diet_name, info in diets_data.items():
        if diet_name == 'Normal':
            print(diet_name)
            for value in info.values():
                print("%.2f" % value)
                # kilojoules = 4.18 * (4 * protein + 4 * carbohydrates + 9.30 * fat)
                kilojoules = 4.18 * (4 * 32.50 + 4 * 60.00 + 9.30 * 40.86) # correct answer = 3134.99
            print("%.2f" % kilojoules)
            # Incorrect Formula
            for pro_carb_fat in info:
                normal_kilojoules = 4.18 * (4 * info[pro_carb_fat]) + (4 * info[pro_carb_fat]) + (9.30 * info[pro_carb_fat])
            print("%.2f" % normal_kilojoules)

    # ****************** Oncology Diet *****************************
    for diet_name, info in diets_data.items():
        if diet_name == 'Oncology':
            print(diet_name)
            for value in info.values():
                print("%.2f" % value)
                # kilojoules = 4.18 * (4 * protein + 4 * carbohydrates + 9.30 * fat)
                kilojoules = 4.18 * (4 * 35 + 4 * 52.50 + 9.30 * 37.63) # correct answer =
            print("%.2f" % kilojoules)
            # Incorrect Formula
            for pro_carb_fat in info:
                oncology_kilojoules = 4.18 * (4 * info[pro_carb_fat]) + (4 * info[pro_carb_fat]) + (9.30 * info[pro_carb_fat]) # this formula gives me the incorrect answer.
            print("%.2f" % oncology_kilojoules)

print(diet_choose_diet())

2) Рефакторинг кода - В приведенном выше коде я дублирую код для каждой диеты. Я попытался поместить это в класс, чтобы убрать. Однако я не получаю желаемый результат (я начал изучать классы несколько недель назад и все еще изучаю концепции). Я прошел через вопросы, размещенные здесь. Может быть, я пропустил посты, которые разъясняют вопросы, которые я хочу уточнить. Если бы вы могли поделиться ссылкой, это будет с благодарностью. Я буду учиться больше. Заранее спасибо!

class DietDisplay:

    def __init__(self, diet, protein, carbohydrates, fat):
        self.diet = diet
        self.protein = protein
        self.carbohydrates = carbohydrates
        self.fat = fat
        self.kilojoules = 0

    def getDiet(self):
        diets_data = {
            'Normal': {'protein': 32.50, 'carbohydrates': 60.00, 'fat': 40.86},
            'Oncology': {'protein': 35.00, 'carbohydrates': 52.50, 'fat': 37.63},
            'Cardiology': {'protein': 32.50, 'carbohydrates': 30.00, 'fat': 26.88},
            'Diabetes': {'protein': 20.00, 'carbohydrates': 27.50, 'fat': 27.95},
            'Kidney': {'protein': 15.00, 'carbohydrates': 55.00, 'fat': 23.65}
        }

        for diet_name, info in diets_data.items():
            print(diet_name)
            for diet in info:
                print(info[pro_carb_fat])
                self.kilojoules = 4.18 * (4 * (diet_name[diet]['protein']) + 4 * (diet_name[diet]['carbohydrates']) + 9.30 * (diet_name[diet]['fat']))

        return self.kilojoules

if __name__ == "__main__":
    d = DietDisplay()
    print(d.getDiet('Normal', 34, 45, 36))

Ответы [ 2 ]

1 голос
/ 20 января 2020

В этой строке:

normal_kilojoules = 4.18 * (4 * info[pro_carb_fat]) + (4 * info[pro_carb_fat]) + (9.30 * info[pro_carb_fat])

pro_carb_fat будет одинаковым значением для каждой части расчета. Он будет запущен один раз для каждого pro_carb_fat в информации. Напечатанное значение будет последним вычисленным. Вы просто получите 4 * fat + 4 * fat + 9.3 * fat

Вместо этого вы можете взять сумму и использовать поиск, чтобы найти множитель. Вы можете просто использовать:

multiples = {
    'protein': 4,
    'carbohydrates': 4,
    'fat': 9.3
}

for diet_name, info in diets_data.items():
    normal_kilojoules = 4.18 * sum(
        multiples[pro_carb_fat] * info[pro_carb_fat] 
        for pro_carb_fat in info
    )
    print(diet_name, ": %.2f" % normal_kilojoules)

Отпечатки:

Normal : 3134.99
Oncology : 2925.83
Cardiology : 2089.93
Diabetes : 1880.73
Kidney : 2089.77

Если эти коэффициенты меняются для разных диет, было бы хорошо использовать класс, в котором эти коэффициенты указаны как свойство .

1 голос
/ 20 января 2020

Есть два решения:

Сделайте следующее в основном методе. Вы передаете 4 параметра в функцию ** init **. Поэтому при создании объекта class вам необходимо передать эти параметры и затем вызвать функцию. В коде видно, что вы передаете параметры в функцию init (т.е. класс), а не в функцию getDiet .

if __name__ == "__main__":
    d = DietDisplay('Normal', 34, 45, 36)
    d.getDiet()

ИЛИ

Просто при создании объекта класса вам нужно передать эти параметры и затем вызвать функцию getDiet в методе init класса:

Убедитесь, что я внес изменения в метод main и функцию __init__ класса и для l oop в функции getDiet

class DietDisplay:

    def __init__(self, diet, protein, carbohydrates, fat):
        self.diet = diet
        self.protein = protein
        self.carbohydrates = carbohydrates
        self.fat = fat
        self.kilojoules = 0
        self.getDiet()

    def getDiet(self):
        diets_data = {
            'Normal': {'protein': 32.50, 'carbohydrates': 60.00, 'fat': 40.86},
            'Oncology': {'protein': 35.00, 'carbohydrates': 52.50, 'fat': 37.63},
            'Cardiology': {'protein': 32.50, 'carbohydrates': 30.00, 'fat': 26.88},
            'Diabetes': {'protein': 20.00, 'carbohydrates': 27.50, 'fat': 27.95},
            'Kidney': {'protein': 15.00, 'carbohydrates': 55.00, 'fat': 23.65}
        }

        for diet_name, info in diets_data.items():
            print(diet_name)
            self.kilojoules = 4.18 * (4 * (diets_data[diet_name]['protein']) + 4 * (diets_data[diet_name]['carbohydrates']) + 9.30 * (diets_data[diet_name]['fat']))

            print(diet_name +":"+ str(self.kilojoules))

if __name__ == "__main__":
    d = DietDisplay('Normal', 34, 45, 36)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...