Python 合并词典
我需要将一个字典(N)中的值附加到另一个字典(M)-下面是伪代码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
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甚至可能有混合值。