簡體   English   中英

基於屬性表達式的對象排序列表

[英]Sorting List of objects based off attribute expression

給定對象列表,我試圖根據給定的屬性以及基於該屬性的表達式對對象進行降序排序。 我的函數傳遞了一個參數,該參數將是我將用於比較的屬性。 我要計算所選營養素屬性與卡路里屬性的比率,例如(x。營養素/ x。卡路里)。 現在有一些極端的情況我不得不感到厭倦。 第一個x.calorie可以為零。 第二個x。營養素可能<1.0,因為我想按降序給出x.calorie的x。營養素比例,這將提供錯誤的結果。 如果您知道一種比使用if語句從function參數中選擇屬性更好的方法,則可以加分。 例如,營養物可能是[脂肪,碳水化合物,蛋白質],如果我的功能通過了,營養物=脂肪,則x。營養!= x。脂肪。 食品類數據成員,名稱,蛋白質,碳水化合物,脂肪,卡路里,派系,蛋白質卡路里,碳水化合物卡路里,脂肪卡路里。 我想根據給定營養素(“蛋白質”,“碳水化合物”或“脂肪”)的卡路里百分數對食物列表進行排序,因此需要對列表進行適當排序。

我嘗試使用attrgetter,它不允許我划分屬性。 我嘗試了一個lambda函數,可在其中縮放值並進行歸一化,但仍未按照正確的順序對列表進行排序。

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)

嘗試下面的代碼。 它涵蓋了您提出的大多數觀點。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM