我有两个词典(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的第一个元素具有相同的值元组,因此,我们只选择一个
答案 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))
一样昂贵,因为所做的就是插入字典。