Dictionary 共享密钥时合并两个词典

Dictionary 共享密钥时合并两个词典,dictionary,merge,python-3.x,Dictionary,Merge,Python 3.x,我正在尝试构建一个小程序,给定一个包含姓名和地址的字典和另一个包含姓名和电话号码的字典,输出应该将两者合并,而不是相互覆盖。最终输出字典应包含姓名、地址(如有)和电话(如有)。 下面是一个例子: addr = {'George': 'via Wagner, 23', 'White': 'Piazza Bologna, 1', 'L. Red': 'via A. Einstein, 12', 'Pete': 'via Pio'} phone = {'Mark': '347 8987989'

我正在尝试构建一个小程序,给定一个包含姓名和地址的字典和另一个包含姓名和电话号码的字典,输出应该将两者合并,而不是相互覆盖。最终输出字典应包含姓名、地址(如有)和电话(如有)。 下面是一个例子:

addr = {'George': 'via Wagner, 23', 'White': 'Piazza Bologna, 1',
    'L. Red': 'via A. Einstein, 12', 'Pete': 'via Pio'}
phone = {'Mark': '347 8987989', 'George': '06 89786765',
     'Mauro B.': '3489878675', 'Pete': '07897878', 'L. Red': '09877887'}
最后一本词典:

addr_phone(addr, phone) -->
{'George':    {'address': 'via Wagner, 23'},
 'Mark':      {'phone': '347 8987989'},
 'George':    {'phone': '06 89786765'},
 'L. Red':   {'phone': '09877887', 'address': 'via A. Einstein, 12'},
 'Pete':       {'phone': '07897878', 'address': 'via Pio'},
 'Mauro B.':   {'phone': '3489878675'},
 'White': {'address': 'Piazza Bologna, 1'}}
我试着写下:

def addr_phone(addr, phone):
    d3={}
    d3.update(addr)
    d3.update(phone)
    for k,v in phone.items():
        if k not in addr:
            d3[k]=v
    return d3
但是我得到了多个相同名称的实例,这不是我想要的。 感谢您的帮助。

使用:

对于python 3,只需将.iteritems替换为.items:

您确实需要在两个输入字典上循环,因为您要将每个名称的值移动到一个新字典。

使用:

对于python 3,只需将.iteritems替换为.items:


您确实需要在两个输入字典上循环,因为您要将每个名称的值移动到一个新字典。

如何将“george”作为字典中的相同键。这违反了命令的定义@Srikar你能说得更具体一点吗?使用Martijn的解决方案,它可以完美地工作。你怎么能把“george”作为字典中相同的键呢。这违反了命令的定义@Srikar你能说得更具体一点吗?使用Martijn的解决方案,它可以完美地工作。我正要发布相同的:。要完成此操作,请将“从集合导入defaultdict”添加到顶部。@jro:我正打算这么做:-PG告诉我这个错误:AttributeError:“dict”对象没有属性“iteritems”@test123表示您正在使用Python 3。然后将其更改为items。@test123:Oops:-P很高兴它有帮助!我正要发布相同的:。要完成此操作,请将“从集合导入defaultdict”添加到顶部。@jro:我正打算这么做:-PG告诉我这个错误:AttributeError:“dict”对象没有属性“iteritems”@test123表示您正在使用Python 3。然后将其更改为items。@test123:Oops:-P很高兴它有帮助!
from collections import defaultdict

out = defaultdict(dict)
for name, phonenumber in phone.iteritems():
    out[name]['phone'] = phonenumber
for name, address in addr.iteritems():
    out[name]['address'] = address
out = defaultdict(dict)
for name, phonenumber in phone.items():
    out[name]['phone'] = phonenumber
for name, address in addr.items():
    out[name]['address'] = address