2017-10-05 10 views
0

내 구조는 YAML 파일에서이 같은 것입니다이 DICT 구조를 반복합니다 :파이썬 방법은

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

내가 (yaml.load 이것을에서로드) 확인하지만 때문에의 가능성이없는

잎 요소의 끝에있는 콜론 (필자는 거기에있을 필요는 없다), 전체 구조는 3 단계 사전이다. 더 효율적으로 만들려면 YML을 변경할 수 있습니다.

이제 구조체를 신속하게 반복하고, 내가 찾은 잎 수준 요소 (예 : '시금치')를 기반으로 '조리법'이라고하는 또 다른 간단한 사전을 찾고 싶습니다. 문자열 '시금치'하위 키 키. 이 조회 사전에는 '시금치 주스'또는 '시금치 파이'또는 '닭 시금치'라는 키가있을 수 있습니다.

나는 이것을 할 수있는 방법을 찾았지만 확실한 비유적인 방법이라고 확신하지 못했습니다. 다음은 내가 가지고있는 것입니다.

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 

더 효율적이고 파이썬적인 조언이나 조언이 있으십니까?

+0

@alfasin 첫 번째 줄에 무슨 문제가 있습니까? – Barmar

답변

2

dict.items()을 사용할 수 있으므로 중첩 루프에 사전 조회를 할 필요가 없습니다.

음식은 정규식이 아니며 문자열이기 때문에 re.search() 대신 in을 사용하십시오. 당신은 전체 단어로 음식을 검색하려면

recipe에서 value를 사용하지 않을 때문에, 당신은 당신이 검사로 re.search(r'\b' + food + r'\b', key) 또는 food in recipes.split(' ')를 사용할 수 .items()

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

필요하지 않습니다 .

+0

조리법에 "c ** ham ** pagne sauce"또는 "s ** pear ** mint tea"가 포함되어 있다면 어떨까요? – ekhumoro

+0

왜 다른 점이 있습니까? 'food in key'는 문자열 일치 만하기 때문에 여전히 찾을 수 있습니다. – Barmar

+0

@ekhumoro'print ("샴페인 소스"의 "햄")을 시도하면 효과가있는 것을 알 수 있습니다. – Barmar