Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并词典_Python - Fatal编程技术网

Python 合并词典

Python 合并词典,python,Python,我需要将一个字典(N)中的值附加到另一个字典(M)-下面是伪代码 if[x] in M: M[x]=M[x]+N[x] else: M[x]=N[x] 对N中的每个键都这样做似乎很不整洁。 实现这一点最有效的方法是什么?当然,您应该已经在“x”中迭代了您的键-但单行解决方案是: M.update({key:((M[key] + value) if key in M else value) for key, value in N.items()}) 不完全确定您的x是什么(猜测M和N

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

if[x] in M:
  M[x]=M[x]+N[x]
else:
  M[x]=N[x] 
对N中的每个键都这样做似乎很不整洁。

实现这一点最有效的方法是什么?

当然,您应该已经在“x”中迭代了您的键-但单行解决方案是:

M.update({key:((M[key] + value) if key in M else value) for key, value in N.items()})

不完全确定您的
x
是什么(猜测
M
N
的键),那么这可能会起作用:

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}
或者请澄清给定示例所需的输出是什么。

当您说“追加”时,我假设这意味着您的DICT中的值是列表。但是,如果下面的技术是简单的对象,如整数或字符串,则可以轻松地进行调整

Python没有提供任何用于处理列表dict的内置方法,最有效的方法取决于数据,因为有些方法在共享键比例较高时效果最好,而其他方法在共享键不多时效果更好

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

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的唯一密钥分开处理。

@HiroProtation update将覆盖,我不认为Op想改写。@Hackaholic oops你是对的。。。我应该读的不仅仅是标题。。。将删除。签出
defaultdict
我看不出“defaultdict”如何简化这里的任何内容。你能说得更清楚些吗?这是因为如果dictionary中已经存在键,defaultdict将不允许为值提供自定义表达式。ha!我试图使用
setdefault
,但失败了。使用
get
提出了一个解决方案。但这很好+1@hiroprotagonist谢谢我最近爱上了
setdefault
:)为什么
defaultdict
当你可以
setdefault
时?@hiroprotation我刚刚意识到OP实际上并没有说他们的dict值是列表。哎呀!:)如果我猜错了,我想我可以补充我的答案……FWIW,这类似于,有点过时了(所以不再是一个好的欺骗目标)。@PM2Ring:谢谢,我不知道那篇帖子。是的,我的解决方案仅适用于
int
@jsbueno可以处理任何具有
\uuuuuuuuuuuuuuuu
方法的东西;dict甚至可能有混合值。