合并两个Python字典时保留两个冲突的值

合并两个Python字典时保留两个冲突的值,python,dictionary,Python,Dictionary,我正在尝试合并两个具有相同键和不同值的词典。尝试使用dict01.update(dict02)函数,但它只返回类似键的dict02值 我想要这样的东西 dict01 = {'a': 1, 'b': 2} dict02 = {'b': 3, 'c': 4} resultant_dict = {'a': 1, 'b': [2, 3], 'c': 4} 没有任何内置功能可以做到这一点。但这并不难: def smush(v1, v2): return [v1, v2] if v1 is no

我正在尝试合并两个具有相同键和不同值的词典。尝试使用
dict01.update(dict02)
函数,但它只返回类似键的
dict02

我想要这样的东西

dict01 = {'a': 1, 'b': 2}
dict02 = {'b': 3, 'c': 4}

resultant_dict = {'a': 1, 'b': [2, 3], 'c': 4}

没有任何内置功能可以做到这一点。但这并不难:

def smush(v1, v2):
    return [v1, v2] if v1 is not None and v2 is not None else v1 or v2

dict01 = {'a': 1, 'b': 2}
dict02 = {'b': 3, 'c': 4}
resultant_dict = {
    k: smush(dict01.get(k), dict02.get(k))
    for k in set(dict01) | set(dict02)
}
正如巴尔马正确指出的那样,这需要进一步的检查。几乎可以肯定,将所有值编入列表会更好。唯一需要修改的是

def smush(v1, v2):
    return [v1, v2] if v1 is not None and v2 is not None else [v1 or v2]
但由于这现在规范了输出格式,因此可以对代码进行泛化,从而使其更加紧凑:

dict01 = {'a': 1, 'b': 2}
dict02 = {'b': 3, 'c': 4}

def smush_dicts(*dicts):
    return {
      k: [d[k] for d in dicts if k in d]
      for k in set(k for d in dicts for k in d)
    }


print(smush_dicts(dict01, dict02))
# => {'b': [2, 3], 'c': [4], 'a': [1]}

编辑:更简单、更正确。

没有任何内置功能可以做到这一点。但这并不难:

def smush(v1, v2):
    return [v1, v2] if v1 is not None and v2 is not None else v1 or v2

dict01 = {'a': 1, 'b': 2}
dict02 = {'b': 3, 'c': 4}
resultant_dict = {
    k: smush(dict01.get(k), dict02.get(k))
    for k in set(dict01) | set(dict02)
}
dict01 = {'a': 1, 'b': 2}
dict02 = {'b': 3, 'c': 4}
resultant_dict = {}
for i in dict01:
    for j in dict02:
        if i == j:
            resultant_dict.update({i:[dict01.get(i),dict02.get(j)]})
            break
        else:
            resultant_dict.update({i:dict01.get(i)})

            
for i in dict02:
    if i not in resultant_dict:
        resultant_dict.update({i:dict02.get(i)})

print( resultant_dict)
正如巴尔马正确指出的那样,这需要进一步的检查。几乎可以肯定,将所有值编入列表会更好。唯一需要修改的是

def smush(v1, v2):
    return [v1, v2] if v1 is not None and v2 is not None else [v1 or v2]
但由于这现在规范了输出格式,因此可以对代码进行泛化,从而使其更加紧凑:

dict01 = {'a': 1, 'b': 2}
dict02 = {'b': 3, 'c': 4}

def smush_dicts(*dicts):
    return {
      k: [d[k] for d in dicts if k in d]
      for k in set(k for d in dicts for k in d)
    }


print(smush_dicts(dict01, dict02))
# => {'b': [2, 3], 'c': [4], 'a': [1]}
编辑:更简单、更正确

dict01 = {'a': 1, 'b': 2}
dict02 = {'b': 3, 'c': 4}
resultant_dict = {}
for i in dict01:
    for j in dict02:
        if i == j:
            resultant_dict.update({i:[dict01.get(i),dict02.get(j)]})
            break
        else:
            resultant_dict.update({i:dict01.get(i)})

            
for i in dict02:
    if i not in resultant_dict:
        resultant_dict.update({i:dict02.get(i)})

print( resultant_dict)
很长,但效果很好


长但工作良好

数据结构应保持一致。如果某些值可以是列表,那么它们都应该是列表。不要考虑数据结构的一致性。谢谢你指出。你的数据结构应该是一致的。如果某些值可以是列表,那么它们都应该是列表。不要考虑数据结构的一致性。谢谢你指出。这正是我要找的。谢谢正是我要找的。谢谢