2017-10-05 54 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