合并两个字典的部分以创建一个新字典

3

我想知道如何将两个字典合并成一个新的字典。假设我有两个字典:

    a = {'aa' : 'aaa', 'bb' : 'bbb', 'cc' : 'ccc'}
    b = {'aa' : '111', 'bb' : '222', 'dd' : '444', 'ee' : '555'}

我想创建第三个字典,使用既包含在a和b中的键,但我希望值来自于字典a。因此它看起来像这样:

   c = {'aa' : 'aaa', 'bb' : 'bbb'}

有人能帮我解决这个问题吗?


我尝试了以下代码: c = b.copy() c.update(a)但是这会将两个字典中的所有键值对都包含进去,虽然它确实将相同键的值改为了来自字典a的值。这是我能得到的最接近的结果。 - zombs07
3个回答

2

对于Python2,只需使用dict.viewkeys来查找字典键的交集:

dictview和其他

将dictview与其他对象的交集作为新集合返回。

a = {'aa' : 'aaa', 'bb' : 'bbb', 'cc' : 'ccc'}
b = {'aa' : '111', 'bb' : '222', 'dd' : '444', 'ee' : '555'}

print({k:a[k] for k in a.viewkeys() & b})
{'aa': 'aaa', 'bb': 'bbb'}

对于Python3,只需使用.keys返回一个dictview对象:

a = {'aa' : 'aaa', 'bb' : 'bbb', 'cc' : 'ccc'}
b = {'aa' : '111', 'bb' : '222', 'dd' : '444', 'ee' : '555'}

print({k: a[k] for k in a.keys() & b})

{'aa': 'aaa', 'bb': 'bbb'}

@zombs07,没错,它确实起作用了,使用字典推导式比for循环更有效率。 - Padraic Cunningham

0
在Python 3.x中,我会使用dict.keys()并对它们执行&(交集)操作,以获取公共键,然后从a中取值。例如 -
a = {'aa' : 'aaa', 'bb' : 'bbb', 'cc' : 'ccc'}
b = {'aa' : '111', 'bb' : '222', 'dd' : '444', 'ee' : '555'}
c = {}
for k in (a.keys() & b.keys()):
    c[k] = a[k]

字典推导方法 -

c = {k:a[k] for k in (a.keys() & b.keys())}

对于 Python 2.7,您可以使用 dict.viewkeys() 方法代替 dict.keys() 方法。


示例/演示 -

>>> a = {'aa' : 'aaa', 'bb' : 'bbb', 'cc' : 'ccc'}
>>> b = {'aa' : '111', 'bb' : '222', 'dd' : '444', 'ee' : '555'}
>>> c = {}
>>> for k in (a.keys() & b.keys()):
...     c[k] = a[k]
...
>>> c
{'aa': 'aaa', 'bb': 'bbb'}

0

将所有键都设为唯一的,就不会出现新字典更新字典a到字典b的问题。你必须让所有键都唯一,但如果没有,可以看下面的代码,在键名后添加1来使其唯一。

a = {'aa' : 'aaa', 'bb' : 'bbb', 'cc' : 'ccc'}
b = {'aa' : '111', 'bb' : '222', 'dd' : '444', 'ee' : '555'}

c = a.copy()

count = 0
for k, v in b.items():
    if a.has_key(k):
        while True:
            count += 1
            if c.has_key(k+str(count)):
                pass
            else:
                c[k+str(count)]=v
                count = 0
                break
    else:
        c[k]=v

print c

{'aa': 'aaa', 'bb': 'bbb', 'cc': 'ccc', 'dd': '444', 'ee': '555', 'aa1': '111', 'bb1': '222'}

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