2010-02-21 2 views
1

사전에서 키를 사용할 수 있는지 확인하는 것이 쉽지만 특정 값은 무엇입니까?사전 값에서 회원 자격을 확인하는 방법이 있습니까? 일단 확인되면 다른 일을 할 수 있습니까?

그래서 내가 여기있는 것은 키가 일관성을 위해서 문자열을 참조하는 목록 사전입니다. 그것은 조금 같을 것이다 :

menu = {'breakfast':['soft-boiled eggs', 'hash brown', 'Earl Grey'], 
     'lunch':['pasta', 'soup'], 
     'dinner':['chips', 'beef stew', 'veggies']} 

지금 내가 뭘하려는 'chips' 내 메뉴에 그렇다면, 나는 'crusty bread'로 교체하고 싶습니다, 말, 있는지 확인합니다. 내가 'chips' in menu['lunch'] 또는 아침 식사를 위해 같은 것을 사용하려고 노력할 수있다라는 것을 알고있다. 그러나 내가 그것이 언제 복무하게되는지에 관해 모른다?

Extension

이의 우리가 음식이라는 클래스는 정의한 가정 해 봅시다 설명하기 어렵다 동안 :

여기
class Food(object): 
def __init__(self, meal): 
    self.meal = meal 
    self.ingredients = collections.defaultdict(set) 
def __str__(self): 
    return "%s" %(self.meal) 

, meal에서는 아침 식사, 점심 또는 저녁 식사 중 하나를 참조합니다. 그리고 우리는 집합의 사전 인 ingredients을 가지고 있습니다. 'potatoes'은 재료이며 열쇠가 있으면 관련 접시가 나타납니다 : 해시 브라운, 칩. '특정 아침 식사에 사용할 수 무엇

breakfast defaultdict(<type 'set'>, {'potatoes': set(['chips', 'hash brown']), 'eggs': set(['omelette', 'hard-boiled', 'soft-boiled']), 'tea': set(['Assam', 'Earl Grey', 'English'])}) 

을 그래서이 기본적으로 : 내 기능에 print meal, menu[meal].ingredients를 호출 할 때 이와 같이, I (이는 내가 넣어 한 모든이기 때문에 아침 식사 만입니다) 다음과 같은 결과를 얻을 수 재료 '.

이제 최악의 상황이 발생했다고 가정 해 보겠습니다. 지금 내가하고 싶은 것은 'potatoes''bread'으로 바꾸고 그 아래에 값/유형 'roll', 'crusty', 'brown'을 넣을 것입니다. 그 일에 대해 어떻게 생각 하나?

그리고 점심 시간으로 가기 위해, 우리는 'Assam' 차를 다 쓴다. Extension 이전의 질문과 마찬가지로, 내가 그것을 어떻게 제거 할 것인가? (처음에 그것이 존재하는지 확인한 후)? menu에서

+2

당신의 아침 식사 예 호기심 사전에서 키/값 쌍을 제거 할 수 있습니다 : 감자 칩 등에서 사용되며 계란은 오믈렛 등에서 사용되며 아삼, 얼 그레이 등에서는 차가 사용됩니다. 따라서 고객은 주문한 차 종류에 관계없이 동일한 차잎을 얻습니다. 이 운동은 Basil Fawlty Hospitality College의 숙제 인 것 같습니다 :-) –

+1

"재미있는"태그가 붙은 이유는 무엇입니까? – kennytm

+2

그리고 당신의 모델은 약간의 정규화가 필요합니다. 어떤 차종에서 차를 주문할 수 있으며 점심과 저녁 모두 많은 요리를 주문할 수 있습니다. 당신은 정말 치킨 파르 미 지아 나 또는 Vindaloo의 성분을 한번 이상 지정하고 싶지 않습니다. 어떻게이 모든 데이터를 디스크에 저장할 것입니까? 간물? 관계형 데이터베이스를 고려해 보셨습니까? –

답변

2

회원 가입은 간단합니다 : 정확히 defaultdict 작품을 변이하지 않는 봉쇄 검사 이후 같은 방법으로

[k for k, v in menu.iteritems() if 'chips' in v] 

회원.

+0

혹시 그 목록을 이해 했습니까? – PizzAzzra

+0

입니다. 여러 가지 가능한 답이 있기 때문에, 우리는 그것들을 모두 반환 할 구조를 필요로합니다. –

0

하나의 분명한 방법은 값을 바꾸고 값을 바꾸는 것입니다. 그러나 IMO를 사용하면 재료를 쉽게 교체 할 수 있도록 설계하는 것이 좋습니다. 각 유형의 성분에 대해 하나의 객체 (싱글 톤 클래스 일 수 있음)를 가지므로, 즉석에서 유형을 바꿀 수 있습니다.

tea.remove('assam') 

그리고 차를 참조한 모든 장소에 영향을 미칩니다. 마찬가지로 모든 식사에서 차를 제거하거나 차를 삭제 한 것처럼 보이거나 감자를 빵으로 교체하려는 경우 차를 사용하고 있던 식사를 추적 할 수 있습니다. 당신은, 모든 기본적인 물건 것을 일단 - 결과적으로 그것은 당신이 사전을 통해 반복하는 방법이다 요구하고있는 기본적인 것 같다

registry.replace(potato, bread) 
0

그렇게 각 식사를 요청할 수 있습니다 레지스트리입니다.

지금
for key,value in mydict.iteritems(): 
    print "%s = %s" %(key, value) 

, 상황에 직접 적용 :

for meal, food in menu.iteritems(): 
    if 'potatoes' in food.ingredients: 
     del food.ingredients['potatoes'] 
     food.ingredients['bread'] = set(['roll', 'crusty', 'brown']) 

'델'

관련 문제