Python 3中的字典嵌套字典

4
我正在寻求制作一个函数addproperty(property_str, property_dict, old_dict = None),其中需要作为参数一个字符串、一个字典和一个可选字典。该函数需要返回一个新的字典,其中相应的值被添加到可选字典中。
例如,如果我输入:
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
教育目的,无其他。 - Denny Nuyts
3个回答

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,则会修改它。如果这是一个问题,请导入copy模块,并用以下内容替换函数中的第一行:
result = copy.deepcopy(old_dict) if old_dict is not None else {}

非常感谢。我也知道有些人会在这里使用zip函数。你的方法甚至看起来更短。我想知道哪种方法最符合“Pythonic”的风格。 - Denny Nuyts
好的,它修改了old_dict并不是问题。每当它被“更新”时,那个old_dict就没有用了。这正是我所需要的。不过,我会记住将来使用copy模块。再次感谢您的帮助。 - Denny Nuyts
你应该修改你的问题以澄清,因为你说:“这个函数需要返回一个新的字典。”怎么在这里使用zip()?它肯定不像是自然地使用zip()。也许你应该写一个答案来展示给我们。 - Francis Avila

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

返回新字典。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接