2013-04-26 170 views
4

我正在尋求一個函數addproperty(property_str, property_dict, old_dict = None),我需要一個字符串,一個字典和一個可選字典作爲參數。 函數需要返回一個新的字典,其中相應的值被添加到可選字典中。Python 3詞典中的字典

例如,如果我輸入:

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

addproperty('capital', capitals_dict)需要返回下面的字典

{'USA': {'capital': 'Washington'}, 'Russia': {'capital': 'Moscow'}, 'Japan': {'capital': 'Tokyo'}} 
功能

我還需要能夠擴大這種字典的新細節添加到這些國家,當我進入那本詞典中可選參數。

例如:

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)需要返回:

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

我應該如何開始在這裏?

+1

是否有一個原因,這兩個非常不同的操作必須是與可選參數相同的功能? – abarnert 2013-04-26 19:13:54

+0

教育理由,沒有別的。 – 2013-04-26 20:20:00

回答

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 

例如:

>>> 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'}} 

注意,如果提供了,這將修改old_dict。如果這是一個問題導入複製模塊,並用以下替換函數的第一行:

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

很多很多,謝謝。我也知道有些人會在這裏使用'zip'函數。你的方法似乎更短。我想知道哪個最「Pythonic」。 – 2013-04-26 19:11:27

+0

那麼,它修改old_dict的事實在這裏沒有問題。無論何時「更新」,該old_dict都沒用。正是我需要的。不過,我會牢記未來的'copy'模塊。再次感謝您的幫助。 – 2013-04-26 19:14:53

+0

你應該修改你的問題來澄清,因爲你確實說,「函數需要返回一個**新的**字典。」如何在這裏使用'zip()'?它當然不像是zip的自然使用。也許你應該寫一個答案給我們看。 – 2013-04-26 19:18:14

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()} 

返回新的字典。