【问题标题】:Merging of two dictionaries [duplicate]合并两个字典[重复]
【发布时间】:2012-09-12 18:29:53
【问题描述】:

我有两个字典如下:

D1={'a':1,'b':2,'c':3}

D2={'b':2,'c':3,'d':1}

我想合并这两个字典,结果应该如下:

D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}

如何在 python 中实现这一点?

【问题讨论】:

  • {'a':1,'b':2,'c':3,'b':2,'c':3,'d':1} 不是 Python 字典。
  • 这是什么 - 我面临着类似的问题

标签: python


【解决方案1】:

我想合并这两个字典,结果应该是 如下:

D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}

如何在 python 中实现这一点?

你不能。 Python dict 中的每个键只能有一个值。您可以做的是将列表或集合作为值。

这是一个带有集合的示例:

d1 = { 'a': 1, 'b': 2, 'c': 3 }
d2 = { 'a': 1, 'b': 5, 'd': 4 }
d3 = {}
def add_dict(target, d):
    for key in d:
        target.setdefault(key, set([])).add(d[key])

add_dict(d3, d1)
add_dict(d3, d2)

这会给你d3:

{'a': set([1]), 'c': set([3]), 'b': set([2, 5]), 'd': set([4])}

您也可以使用列表来执行此操作(可能更接近您的示例):

d1 = { 'a':1, 'b':2, 'c': 3}
d2 = { 'b':2 ,'c':3, 'd': 1}
d3 = {}
def add_dict(target, d):
    for key in d:
        target.setdefault(key, []).append(d[key])

add_dict(d3, d1)
add_dict(d3, d2)

你会得到这个:

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

但是,看着{'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}(不能是字典),您似乎完全在追求不同的数据结构。也许是这样的:

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

result += [ { 'key': key, 'value': d1[key] } for key in d1 ]
result += [ { 'key': key, 'value': d2[key] } for key in d2 ]

这将产生这个,它看起来更接近您最初想到的数据结构:

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

【讨论】:

  • 我对此进行了测试,似乎遗漏了一些东西,因为我确实输入了: type({0.8080260303687652: 2e-05, 0.8069414316702677: 1e-05, 0.8091106290672485: 1e-05, 0.815618e-202}815618221: ) ,并得到结果'dict'。那么显然它可以是一本字典?
  • @El_1988 除非我遗漏了什么,否则您的示例中的所有键都不同。每个键只有一个值。
【解决方案2】:

你不妨试试:

D3 = {}
D3.update(D1)
D3.update(D2)

在这里,我们首先创建一个空字典D3,然后从其他两个字典更新它。

注意更新的顺序需要注意:如果D2D1共享一些key,上面的代码会用D2覆盖D1的对应条目。

请注意,按键将不会重复。你给D3={a:1,b:2,c:3,b:2,c:3,d:1} 的例子不是一个有效的字典。

【讨论】:

  • +1 -- 但是如果你在解释器中输入D3={a:1,b:2,c:3,b:2,c:3,d:1},它会很高兴地允许它(前提是a,b,c,d 被定义并且是可散列的)。据我所知,它 is 是构造 a 字典的有效表达式(尽管我不确定标准是否明确说明您是否将第一个值用于重复键或最后一个,或者如果它是“随机的”)。
【解决方案3】:

根据定义,字典不能有重复的键,因此“合并”字典实际上会给出以下结果(注意顺序是任意的):

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

您可以创建一个字典的克隆并将另一个字典中的条目合并到其中:

D3 = dict(D1)
D3.update(D2)

或者您可以从每个输入字典的 (key, value) 元组的串联中创建一个新字典:

D3 = dict(D1.items() + D2.items())

如果您真的想要重复键的多个值,则需要每个键的值列表:

from itertools import groupby
dict(( (key, [v for k, v in group]) for key, group in groupby(sorted(D1.items() + D2.items()), lambda x: x[0])))

【讨论】:

    【解决方案4】:
    In [3]: D1={'a':1,'b':2,'c':3}
    
    In [4]: D2={'b':2,'c':3,'d':1}
    
    In [5]: D1.update(D2)
    
    In [6]: D1
    Out[6]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
    

    更新

    替代解决方案

    In [9]: D3=D1.copy()
    
    In [10]: D3.update(D2)
    
    In [11]: D3
    Out[11]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
    
    In [12]: D4=dict(D1, **D2)
    

    In [13]: D4
    Out[13]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
    

    In [16]: D5 = dict(D1.items() + D2.items())
    
    In [17]: D5
    Out[17]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
    

    【讨论】:

    • ... 修改 D1。最好先复制一份。
    • 是的,只是 ipython 中的一个快速会话;这里有4个或多或少相同的答案:-)
    【解决方案5】:

    你要问的是不可能的,因为在 Python 字典中不能有两个具有相同值的不同键。

    与您的问题最接近的答案是:

    D3 = dict( D1.items() + D2.items() )

    注意:如果您对同一个键有不同的值,则 D2 中的值将是 D3 中的值。

    示例:
    D1 = { 'a':1, 'b'=2 }
    D2 = { 'c':3, 'b':3}
    那么,D3 将是:
    D3= { 'a':1, 'b':3, 'c':3 }

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多