2013-03-03 100 views
-1

我有兩個字典(Python),我正在合併基於值(非關鍵)。但是,我的方法效率很低,基本上是O(n^2)。有沒有更好的方法去解決它?基於值Python合併字典

本例中的字典本質上是一個整數鍵,值是一個元組(5個元素長),即所有整數。

謝謝!

實施例:

辭典:{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

您能詳細解釋一下這個「價值合併」嗎?例如,您可以發佈兩個示例詞典和合並詞典的理想結果。鍵和值之間是否存在雙射? – Hyperboreus 2013-03-03 21:19:38

+0

當然,字典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的第一個元素具有相同的值元組,因此我們只選擇一個元素。 – user308827 2013-03-03 21:20:13

+3

@OP,更好地編輯你的問題,不要添加評論。 – Hyperboreus 2013-03-03 21:20:50

回答

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) 
+0

另外,請使用'a.iteritems()'來避免在字典中創建新的項目列表。 – JCash 2013-03-03 22:10:16

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)} 

如果記憶是一個問題,你可以d改變vk[v].append(k)一行;現在它建立了一個不需要的中間結構,但我並不完全確定在碰撞情況下正確的選擇邏輯應該是什麼。

1

我什麼工作是

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

..這是代碼緊湊,也許只爲O(n*log(n))昂貴,因爲所有的事已至此,在字典中的插入。