【问题标题】:Searching Dictionaries through User Input通过用户输入搜索字典
【发布时间】:2020-05-10 21:19:59
【问题描述】:

我不是 Python 的初学者,但我也不是太有经验。

我正在做一个小项目,我想知道最好的做法是什么。我想制作一个包含不同冷冻食品的食品字典,显示每个条目的营养价值。

Food_Catalog_Frozen.py 中的条目示例如下:

Burrito = {
    "calories": 310,
    "fats": 14,
    "sodium": 330,
    "carbohydrates": 35,
    "sugars": 1,
    "protein": 9,
}

那我想做一个单独的“做什么菜?”用户输入他们吃的所有东西并添加所有值的脚本。

在处理任何分析之前,我想看看是否可以将食物原样打印出来。以下是尝试打印上述卷饼的营养信息的代码。

import Food_Catalog_Frozen as Frozen

print("What's cookin', good lookin'?\n")

STOP = False

while STOP == False:
    food = input()  # Enter Burrito
    if food == "done":
        STOP = True
    else:
        print(Frozen.food)

并抛出以下错误:

 print(Frozen.food)
AttributeError: module 'Food_Catalog_Frozen' has no attribute 'food'

主要问题是可变食物,尽管在这个例子中现在被视为卷饼,但字典仍在搜索 Frozen.food 而不是 Frozen.Burrito,它确实有效。似乎无法通过用户输入来搜索字典。

如果有人能说出为什么这不起作用或者是否有更好的方法来做到这一点,我们将不胜感激。谢谢。

【问题讨论】:

  • 你能显示你所有的 Food_Catalog_Frozen.py 代码吗?
  • 您在 Food_Catalog_Frozen 中哪里可以看到 food 属性?做print(Frozen.Burrito)
  • 墨西哥卷饼行是我到目前为止的所有条目。这就是现在所有的代码。一旦我可以让它工作,我计划添加更多。
  • 这能回答你的问题吗? Why dict.get(key) instead of dict[key]?
  • 你需要Frozen.Burrito[food]

标签: python dictionary user-input


【解决方案1】:

快速解决方案是做print(getattr(Frozen, food))。这会起作用,因为BurritoFrozen 的实际变量(属性),而getattr 用于获取属性。但是,我不推荐这种解决方案。

最好的方法是重新考虑您的设计。您可以使用顶级dict,而不是让单个变量对应于可能的食物类型:

foods = {
    "Burrito": {
        "calories": 310,
        "fats": 14,
        "sodium": 330,
        "carbohydrates": 35,
        "sugars": 1,
        "protein": 9
    },
    ...
}

然后您将print(Frozen.food) 更改为print(Frozen.foods[food])。如果您想确保输入的食物已注册,您可以将print 包裹在以下if 中:

if food in Frozen.foods:
    print(Frozen.foods[food])

【讨论】:

    【解决方案2】:

    当您搜索 Frozen.food 时,您实际上是在检查冷冻食品目录中名为“food”的条目。

    请注意,这与输入变量 food 无关。无论 food 持有什么值(在您的示例中为“Burrito”),都会查找不存在的 Frozen.food。

    您可以做的是使用顶级字典,正如其他答案所建议的那样。

    另一种解决方案是在目录中定义一个函数,例如 get_food(food_name)。

    然后您可以在主/客户端类中调用 get_food(food) 并获取所需的字典作为输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      相关资源
      最近更新 更多