2013-04-26 68 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()} 

返回新的字典。