Учитывая список объектов, я пытаюсь отсортировать объекты в порядке убывания на основе заданного атрибута и выражения на основе этого атрибута.
Моей функции передается параметр, который будет атрибутом, который я буду использовать для сравнения. Я хочу рассчитать отношение выбранного атрибута питательных веществ к атрибуту калорийности, например (x.nutrient / x.calorie). Теперь есть пара крайних случаев, от которых я должен устать. Первая x.calorie может быть нулевой. Второй x.nutrient может быть <1.0, что даст ложные результаты, так как я хочу, чтобы соотношение x.nutrient и x.calorie в порядке убывания. Бонусные баллы, если вы знаете лучший способ, чем использование операторов if для выбора атрибута из параметра функции. Например, питательным веществом может быть [жир, углеводы, белок], и если передается моя функция, то питательное вещество = жир, x.nutrient! = X.fat. Элементы данных класса продуктов питания, имя, белок, углеводы, жир, калории, фракция, белок_калории, углеводов_калорий, жиров_калорий. Я хочу отсортировать список продуктов на основе процентного содержания калорий данного питательного вещества («белок», «углеводы» или «жир»), список необходимо отсортировать по месту. </p>
Я пытался использовать attrgetter, который не позволяет мне разделять атрибуты. Я пробовал лямбда-функцию, в которой я масштабирую значения, и нормализует, но все еще не сортирует список в правильном порядке.
def sort_food_list(foods, nutrient):
if nutrient == 'protein':
foods.sort(key=lambda x: (x.protein * 100) / x.calories if (x.calories * 100) != 0 else 0, reverse=True)
if nutrient == 'carbs':
foods.sort(key=lambda x: (x.carbs * 100) / (x.calories * 100) if x.calories != 0 else 0, reverse=True)
if nutrient == 'fat':
foods.sort(key=lambda x: (x.fat * 100) / (x.calories * 100) if x.calories != 0 else 0, reverse=True)