嵌套for循环迭代多个字典,有没有更简单的方法?

2024-09-29 18:38:57 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我的懒惰的后方正在尝试在python3.x中创建一个膳食计划生成器,这样我就不必每周五花30分钟来弄清楚我应该吃什么,但我对编码和一些东西还不熟悉。我仍在学习Udemy课程,但我想用代码来正确地学习。不管怎样,到目前为止我得到的是:

class Meals():

    def __init__(self,breakfast,lunch,dinner):
        self.breakfast=breakfast
        self.lunch=lunch
        self.dinner=dinner
    def __str__(self):
        return f"Breakfast will be {self.breakfast}.\nLunch will be        {self.lunch}.\nDinner will be {self.dinner}."
    def cost(self):
        day_meals=[self.breakfast,self.lunch,self.dinner]
        day_cost=0
        for i in day_meals:
            for ingredient in i:
                for key,value in Shop2.items():
                    if key in ingredient:
                        day_cost+=value
        return f"Today will cost £{round(day_cost,2)}."

如果我这样做了:

    monday_meals=Meals(random.choice(list(breakfasts.keys())),random.choice(list(lunches.keys())),random.choice(list(dinners.keys())))

然后调用monday\u Diems.breakfast,然后我得到我想要的结果,从“早餐”字典中随机选择的键,但是每当我调用: 星期一餐费() 然后我得到£0,未显示错误

作为参考,我的测试词典如下:

breakfasts={"a bowl of Rice Crispies":["cereal_1","milk"],"Weetabix":["cereal_2","milk"],"some Golden Grahams":["cereal_3","milk"],"toast":["bread","butter"],"scrambled eggs":["egg","egg","milk"]}

lunches={"cereal bars":["cereal_bar","cereal_bar"],"a boring ham sandwich":["bread","ham"],"some fruit":["banana","apple"],"salad":"salad_bag"}

dinners={"Student Meal #1":["mince","red_sauce","pepper","onion"],"Student Meal #2":["c_breast","white_sauce","onion","pepper"],"Student Meal #3":["egg","pepper","tomato","onion"]}

Shop2={"egg":0.3,"tomato":0.35,"pepper":0.33,"onion":0.4,"mince":1.2,"c_breast":0.7,"rice":0.8,"red_sauce":1.4,"white_sauce":1.5,"cereal_1":0.4,"milk":0.13,"cereal_2":0.35,"cereal_3":0.45,"bread":0.04,"butter":0.04,"cereal_bar":0.75,"ham":0.25,"banana":0.3,"apple":0.3,"salad":0.75}

如果能帮我找到一个更简单的方法来计算一天的餐费,我将不胜感激


Tags: inselfeggdefwilllunchsaucecost
3条回答

您可以通过以下方式实现您的设计:

# inside your class:

@staticmethod
def calculate_meal_cost(ingredients, shopdict):
    return sum(shopdict[ingredient] for ingredient in ingredients)

@property
def cost(self):
    breakfast_cost = self.calculate_meal_cost(breakfasts[self.breakfast], Shop2)
    lunch_cost = self.calculate_meal_cost(lunches[self.lunch], Shop2)
    dinner_cost = self.calculate_meal_cost(dinners[self.dinner], Shop2)
    return breakfast_cost + lunch_cost + dinner_cost

然后:

meal = Meal(...)  # however you pick your meals is fine
meal.cost  # note: no parens

问题在于实例化类时传入的内容breakfasts.keys()只给你dict的键,顾名思义:键是冒号左边的东西,例如“一碗米饭脆”。实际的配料是,但这些永远不会发送到用餐实例;所以当你遍历“成分”时,你实际上是在遍历键的字母

您可以通过使用.values()而不是.keys()来解决这个问题,尽管更好的方法可能是同时传递键和值,以便__str__方法输出描述,而不是成分;我把它作为练习

正在使用餐食的字符串名称初始化您的餐食对象(例如,随机选择早餐。keys()可能是“Weetabix”)

当你在一日三餐中反复使用“i中的配料”时,你实际上是在反复使用维他麦的每个“字符”,所以你的配料应该是“W”“e”“e”。。等等

相反,您可能希望通过选择breakfasts.items()来初始化膳食。然后你会有一个元组,例如(“维他麦”,“谷类2”,“牛奶”),在自助早餐

然后可以在循环中解包:

for name,ingredients in day_meals:
   for i in ingredients:
      # and so on..

相关问题 更多 >

    热门问题