合并两个Python字典中相同键的值

4

我想通过它们的键合并两个字典的值。例如:

d1 = {'a':1, 'b':2, 'c':3}
d2 = {'a':2, 'b':[2,3], 'd':3}

期望的输出:

{'a': [1, 2], 'b': [2, 2, 3], 'c': [3], 'd': [3]}

我目前所拥有的是

d12 = {}
for d in (d1, d2):
    for k,v in d.items(): 
        d12.setdefault(k, []).append(v)

该技术产生

d12 = {'a': [1, 2], 'b': [2, [2, 3]], 'c': [3], 'd': [3]}

不是期望的输出结果。

我在 Stack Overflow 上搜索了一下,发现这篇帖子回答了我的问题,只要它没有抛出 TypeError: can only concatenate tuple (not "int") to tuple. 的错误。

3个回答

7
问题在于你的值有时是 int,有时是 list。必须检查数据类型并相应地使用 appendextend
for k, v in d.items():
    if isinstance(v, list):
        d12.setdefault(k, []).extend(v)
    else:
        d12.setdefault(k, []).append(v)

0

仅使用append

d1 = {'a':1, 'b':2, 'c':3}
d2 = {'a':2, 'b':[2,3], 'd':3}

d12 = {}
for d in (d1, d2):
    for k,v in d.items(): 
        if not isinstance(v, list):
            d12.setdefault(k, []).append(v)
        else:
            for i in v:
                d12.setdefault(k, []).append(i)


print(d12)

0
你也可以尝试使用 dict.update 和一个 lambda flatten 函数以及 dict.get:
dct = {}
for i in d1.keys() | d2.keys():
    flatten = lambda *n: [e for a in n for e in (flatten(*a) if isinstance(a, (tuple, list)) else (a,))]
    l = flatten([i for i in [d1.get(i, None), d2.get(i, None)] if i])
    dct.update({i: l})
print(dct)

输出:

{'b': [2, 2, 3], 'a': [1, 2], 'c': [3], 'd': [3]}

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