合并词典

时间:2017-05-02 12:11:29

标签: python

我需要将值从一个字典(N)附加到另一个字典(M) - 下面的伪代码

if[x] in M:
  M[x]=M[x]+N[x]
else:
  M[x]=N[x] 

为N中的每个键执行此操作似乎是非常不整齐的编码 实现这一目标的最有效方法是什么?

3 个答案:

答案 0 :(得分:3)

当然你应该在“x”中迭代你的键 - 但是单行解决方案是:

<div>textbox1</div>
<div>textbox2</div>
<div>textbox3</div>
<div>textbox4</div>
<div>textbox5</div>
<div>textbox6</div>
<div>textbox7</div>
<div>textbox8</div>

答案 1 :(得分:1)

不完全确定您的x是什么(猜测MN的键),然后这可能会有效:

M = {key: M.get(key, 0) + N.get(key, 0) for key in set((*M, *N))}

示例:

M = {'a': 1, 'c': 3, 'e': 5}
N = {'a': 2, 'b': 4, 'c': 6, 'd': 8}

你得到:

print(M)  # {'a': 3, 'e': 5, 'd': 8, 'c': 9, 'b': 4}

或者请说明给定示例的期望输出是什么。

答案 2 :(得分:1)

当你说“追加”时,我认为这意味着你的dicts中的值是列表。但是,如果它们是简单的对象,如整数或字符串,则可以很容易地调整下面的技术。

Python没有提供任何用于处理列表序列的内置方法,大多数有效的方法取决于数据,因为某些方法在高比例时效果最好共享密钥,当共享密钥不多时,其他方式会更好。

如果共享密钥的比例不是太高,则此代码效率相当高:

m = {1:[1, 2], 2:[3]}
n = {1:[4], 3:[5]}

for k, v in n.items():
    m.setdefault(k, []).extend(v)

print(m)

<强>输出

{1: [1, 2, 4], 2: [3], 3: [5]}

通过缓存.setdefault方法和空列表,您可以稍快一些:

def merge(m, n):
    setdef = m.setdefault
    empty = []
    for k, v in n.items():
        setdef(k, empty).extend(v)

如果你期望共享密钥的比例很高,那么最好对密钥执行set操作(在Python 3中,dict.keys()返回一个类似set的对象,这对构造非常有效),以及与N的唯一键分开处理共享密钥。