2017-10-05 35 views
0

我的结构是这样的YAML文件:Python的方式来过这个字典结构迭代

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

我与yaml.load加载此()

不知道,但可能因为在叶元素结尾的冒号(我不知道需要在那里),整个结构是3级字典。如果需要,我可以更改YML,以提高效率。现在,我想快速遍历结构,并基于我发现的叶级元素(例如'菠菜'),我想查找另一个简单的字典,称为'食谱',它可以有字符串'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 

任何意见/指针,使其更有效率和/或pythonic?

+0

@alfasin第一行有什么问题? – Barmar

回答

2

您可以使用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(' ')作为测试。

+0

如果包括食谱,比如说“c ** ham ** pagne sauce”或“s ** pear **薄荷茶”会怎么样? – ekhumoro

+0

为什么会有所作为? 'key'中的食物只是在进行字符串匹配,所以它仍然会找到它。 – Barmar

+0

@ekhumoro尝试'打印(“香槟酱”中的“火腿”)',你会看到它的作品。 – Barmar