2013-04-26 2 views
4

함수를 만들려고합니다. addproperty(property_str, property_dict, old_dict = None) 여기서 문자열, 하나의 사전 및 하나의 선택적 사전을 인수로 사용해야합니다. 함수는 해당 값이 선택적 사전에 추가되는 새 사전을 반환해야합니다.사전 내의 파이썬 3 사전

예를 들어. 내가 입력하는 경우 :

capitals_dict = {'USA': 'Washington', 'Russia': 'Moscow', 'Japan': 'Tokyo'} 

다음 사전

{'USA': {'capital': 'Washington'}, 'Russia': {'capital': 'Moscow'}, 'Japan': {'capital': 'Tokyo'}} 
에게 반환해야 addproperty('capital', capitals_dict) 기능 나는 또한 내가 사전에 있음을 입력 할 때 해당 국가에 새로운 내용을 추가하는 등의 사전을 확장 할 수 있어야합니다

선택적 매개 변수. 예를 들어

:

{'USA': {'capital': 'Washington', 'demonym': 'American'}, 'Russia': {'capital': 'Moscow', 'demonym': 'Russian'}, 'Japan': {'capital': 'Tokyo', 'demonym': 'Japanese'}} 

가 어떻게 여기 시작해야합니다

old_dict = {'USA': {'capital': 'Washington'}, 'Russia': {'capital': 'Moscow'}, 'Japan': 'capital': 'Tokyo'}} 
demonym_dict = {'USA': 'American', 'Russia': 'Russian', 'Japan': 'Japanese'} 

그런 다음 addproperty('demonym', demonym_dict, old_dict) 반환 할 필요가

? 예를 들어

+1

이 두 가지 매우 다른 연산이 선택적 매개 변수와 동일한 함수 여야하는 이유가 있습니까? – abarnert

+0

교육적인 이유, 그 밖의 것은 없습니다. –

답변

5
def addproperty(property_str, property_dict, old_dict=None): 
    result = old_dict if old_dict is not None else {} 
    for k, v in property_dict.items(): 
     result.setdefault(k, {})[property_str] = v 
    return result 

:이 제공되는 경우이 old_dict을 수정할 것을

>>> capitals_dict = {'USA': 'Washington', 'Russia': 'Moscow', 'Japan': 'Tokyo'} 
>>> result = addproperty('capital', capitals_dict) 
>>> result 
{'Japan': {'capital': 'Tokyo'}, 'Russia': {'capital': 'Moscow'}, 'USA': {'capital': 'Washington'}} 
>>> demonym_dict = {'USA': 'American', 'Russia': 'Russian', 'Japan': 'Japanese'} 
>>> addproperty('demonym', demonym_dict, result) 
{'Japan': {'demonym': 'Japanese', 'capital': 'Tokyo'}, 'Russia': {'demonym': 'Russian', 'capital': 'Moscow'}, 'USA': {'demonym': 'American', 'capital': 'Washington'}} 

참고. 이 경우 문제가 복사 모듈을 가져 와서 다음과 같이 함수의 첫 번째 행을 대체 :

result = copy.deepcopy(old_dict) if old_dict is not None else {} 
+0

많은 많은 감사. 어떤 사람들은 여기에'zip' 함수를 사용한다는 것도 알고 있습니다. 귀하의 방법은 더 짧아 보입니다. 나는 가장 'Pythonic'이 될지 궁금해. –

+0

글쎄, old_dict를 변경한다는 사실은 아무런 문제가되지 않습니다. 업데이트 될 때마다 old_dict는 아무 쓸모가 없습니다. 정확히 내가 필요로하는 것. 미래를위한'copy' 모듈을 염두에 두겠습니다. 다시 당신의 도움에 감사드립니다. –

+0

"** 새로운 ** 사전을 반환해야합니다."라고 말하기 때문에 질문을 수정해야합니다. 여기에'zip()'을 어떻게 사용합니까? 확실히 zip을 자연스럽게 사용하는 것처럼 보이지는 않습니다. 어쩌면 우리에게 보여주는 답을 써야 할 것입니다. –

0

뭔가 같이 :

def add_property(item,dic,new_dic=None): 
    if not new_dic: 
     for k,v in dic.items(): 
      dic[k]={item:v} 
    else:   
     for k,v in dic.items(): 
      dic[k].update({item:new_dic[k]}) 
    .....:    

In [124]: capitals_dict = {'USA': 'Washington', 'Russia': 'Moscow', 'Japan': 'Tokyo'} 

In [125]: add_property("Capital", capitals_dict) 

In [126]: add_property("demonym",capitals_dict,demonym_dict) 

In [128]: capitals_dict 
Out[128]: 
{'Japan': {'Capital': 'Tokyo', 'demonym': 'Japanese'}, 
'Russia': {'Capital': 'Moscow', 'demonym': 'Russian'}, 
'USA': {'Capital': 'Washington', 'demonym': 'American'}} 
2

내 미친 한 줄 솔루션 :

def addproperty(property_str, property_dict, old_dict = None): 
    return {k: (lambda k, v: old_dict[k] if old_dict != None else { property_str: v})(k,v) for k, v in property_dict.items()} 

새 사전을 반환합니다.