【问题标题】:pythonic way to iterate over this dict structurepythonic方式来迭代这个dict结构
【发布时间】:2018-03-17 08:16:26
【问题描述】:

我的结构在 YAML 文件中是这样的:

nutrition: 
  fruits: 
    apple: 
    banana: 
    pear: 
  veggies: 
    spinach: 
    zucchini:
    squash:
  meats:
    chicken:
    fish:
    ham:

我用 yaml.load() 加载它

不确定,但可能是因为叶元素末尾的冒号(我不确定是否需要在那里),整个结构是一个 3 级字典。如果需要,我可以更改 YML 以提高效率。

现在,我想快速迭代结构,并根据我找到的叶级元素(例如'spinach'),我想查找另一个简单的字典,称为'recipes',它可以包含字符串'spinach' 作为其键的 子字符串。这个查找字典的键可以是“菠菜汁”或“菠菜派”或“鸡肉菠菜”。

我找到了一种方法来做到这一点,但不确定它是否是正确的 Pythonic 方式。这是我所拥有的:

for food_class in database['nutrition']:
    for food in database['nutrition'][food_class]:
        for key, value in recipes.items():
            if re.search(food, key):
                print key

有什么建议/指针可以使其更高效和/或 Python 化?

【问题讨论】:

  • @alfasin 第一行有什么问题?

标签: python dictionary idioms


【解决方案1】:

您可以使用dict.items(),因此您无需将字典查找放在嵌套循环中。

食物不是正则表达式,只是字符串,所以使用in 而不是re.search()

由于您没有使用来自recipevalue,因此您不需要.items()

for food_class, foods in database['nutrition'].items():
    for food in foods:
        for key in recipes:
            if food in key:
                print(key)

如果要搜索食物的全词,可以使用re.search(r'\b' + food + r'\b', key)food in recipes.split(' ')作为测试。

【讨论】:

  • 如果食谱包括“champagne 酱”或“spear薄荷茶”怎么办?
  • 为什么会有不同? food in key 只是在做字符串匹配,所以还是会找到的。
  • @ekhumoro 试试print("ham" in "champagne sauce"),你会发现它有效。
  • 但是“火腿”不是“香槟酱”的成分。我想 OP 正则表达式会搜索整个单词。
  • @ekhumoro OP的代码使用字典的键作为搜索字符串,它甚至不是一个RE。