如何在Python中将字典合并在一起?

时间:2010-05-09 20:31:12

标签: python dictionary

d3 = dict(d1, **d2)

据我所知,这会合并字典。但是,它有独特之处吗?如果d1与d2具有相同的键但值不同,该怎么办?我希望合并d1和d2,但如果有重复键,则d1具有优先权。

7 个答案:

答案 0 :(得分:148)

如果您不再需要原始d2,则可以使用.update()方法:

  

使用其他覆盖现有密钥中的键/值对更新字典。返回None

E.g:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'b': 1, 'c': 3}
>>> d2.update(d1)
>>> d2
{'a': 1, 'c': 3, 'b': 2}

<强>更新

当然,您可以先复制字典,以便创建新的合并字典。这可能是也可能不是必要的。如果您在字典中有复合对象(包含其他对象的对象,如列表或类实例),则还应考虑copy.deepcopy

答案 1 :(得分:40)

在Python2中,

d1={'a':1,'b':2}
d2={'a':10,'c':3}

d1覆盖d2:

dict(d2,**d1)
# {'a': 1, 'c': 3, 'b': 2}

d2覆盖d1:

dict(d1,**d2)
# {'a': 10, 'c': 3, 'b': 2}

这种行为不仅仅是实施的侥幸;保证in the documentation

  

如果在。中同时指定了一个键   位置参数和关键字   参数,与之相关的值   关键字保留在   字典。

答案 2 :(得分:14)

如果您希望d1在冲突中具有优先权,请执行以下操作:

d3 = d2.copy()
d3.update(d1)

否则,请反转d2d1

答案 3 :(得分:1)

我的解决方案是定义 merge 函数。它并不复杂,只需花费一条线。这是Python 3中的代码。

from functools import reduce
from operator import or_

def merge(*dicts):
    return { k: reduce(lambda d, x: x.get(k, d), dicts, None) for k in reduce(or_, map(lambda x: x.keys(), dicts), set()) }

测试

>>> d = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> d_letters = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d, d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d_letters, d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> merge(d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge()
{}

它适用于任意数量的字典参数。如果这些字典中有任何重复的键,则参数列表中最右边的字典中的键将获胜。

答案 4 :(得分:1)

Trey Hunner has a nice blog post概述了合并多个词典的几个选项,包括(对于python3.3 +)ChainMapdictionary unpacking

答案 5 :(得分:1)

Python 3.9开始,运算符|用两个字典的合并键和值创建一个新字典:

# d1 = { 'a': 1, 'b': 2 }
# d2 = { 'b': 1, 'c': 3 }
d3 = d2 | d1
# d3: {'b': 2, 'c': 3, 'a': 1}

此:

使用合并的键以及d2和d1的值创建一个新的字典d3。 d2和d1共享密钥时,d1的值优先。


还要注意|=运算符,它通过合并d1来修改d2,优先于d1值:

# d1 = { 'a': 1, 'b': 2 }
# d2 = { 'b': 1, 'c': 3 }
d2 |= d1
# d2: {'b': 2, 'c': 3, 'a': 1}

答案 6 :(得分:0)

我相信,如上所述,使用d2.update(d1)是最好的方法,如果您仍然需要,也可以先复制d2

虽然,我想指出dict(d1, **d2)实际上是一种合并字典的错误方法,因为关键字参数需要是字符串,因此如果你有dict,它将会失败,例如:

{
  1: 'foo',
  2: 'bar'
}