Сортировка списка объектов на основе выражения атрибута - PullRequest
1 голос
/ 04 июня 2019

Учитывая список объектов, я пытаюсь отсортировать объекты в порядке убывания на основе заданного атрибута и выражения на основе этого атрибута. Моей функции передается параметр, который будет атрибутом, который я буду использовать для сравнения. Я хочу рассчитать отношение выбранного атрибута питательных веществ к атрибуту калорийности, например (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)

1 Ответ

0 голосов
/ 05 июня 2019

Дайте код ниже, попробуйте.Он охватывает большинство вопросов, которые вы подняли.

class Food:
    def __init__(self, name, protein, carbs, fat, calories=0):
        self.name = name
        self.protein = protein
        self.carbs = carbs
        self.fat = fat
        self.calories = calories

    def __repr__(self):
        return '[name: {} protein: {} carbs: {} fat: {} calories: {}]'.format(self.name, self.protein, self.carbs,
                                                                              self.fat, self.calories)


foods = [Food('F1', 12, 34, 56, 1), Food('F2', 11, 4, 16, 11), Food('F3', 11, 5, 56, 11), Food('F4', 1, 277, 3, 4),
         Food('F5', 1234, 77, 333)]


def sort_foods(foods, nutrient):
    foods.sort(key=lambda x: ((getattr(x, nutrient) * 100) / x.calories) if x.calories else 0, reverse=True)


sort_foods(foods, 'fat')
print('By fat')
print(foods)
print()

print('By protein')
sort_foods(foods, 'protein')
print(foods)
print()

print('By carbs')
sort_foods(foods, 'carbs')
print(foods)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...