Python基于值合并字典

时间:2013-03-03 21:18:28

标签: python dictionary merge

我有两个词典(Python),我根据值(非键)合并。但是,我的方法效率很低,基本上是O(n ^ 2)。有没有更好的方法呢?

本例中的字典本质上是一个整数键,值是一个元组(长5个元素),所有整数。

谢谢!

示例:

字典A:{25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}

字典B:{46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

合并的字典是:{25: (1, 5, 1, 5), 34: (5, 24, 5, 24), 29: (5, 23, 1, 5)}。请注意,字典A的第一个元素与字典B的第一个元素具有相同的值元组,因此,我们只选择一个

3 个答案:

答案 0 :(得分:1)

这样的事可能吗?

a = {25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}
b = {46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

for k, v in b.items ():
    if v not in a.values (): a [k] = v

print (a)

但我猜它仍然是O(n ** 2)。

编辑: 对于大词典来说,这应该更快:

c = {}
for k, v in a.items (): c [v] = k
for k, v in b.items (): c [v] = k

c = dict ( (b, a) for a, b in c.items () )
print (c)

答案 1 :(得分:1)

我可能会这样做:

from collections import defaultdict

A = {25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}
B = {46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

vk = defaultdict(list)
sources = A, B
for source in sources:
    for k,v in source.iteritems():
        vk[v].append(k)

out = {v[0]:k for k,v in vk.iteritems()}

始终采用sources中最早的密钥,并生成

>>> out
{25: (1, 5, 1, 5), 34: (5, 24, 5, 24), 29: (5, 23, 1, 5)}

如果记忆是一个问题,你可以改变vk[v].append(k)行;现在它建立了一个不需要的中间结构,但我不完全确定碰撞情况下正确的选择逻辑应该是什么。

答案 2 :(得分:1)

对我有用的是

C={v:k for k,v in {v:k for k, v in B.items()+A.items()}.iteritems()}

..这是紧凑的代码,可能只有O(n*log(n))一样昂贵,因为所做的就是插入字典。