2013-10-28 77 views
0

是否有將字典中的2個值與所有其他值進行比較的簡單方法? 舉例來說,如果我有一個字典:將字典中的2個值與所有其他值進行比較

dict = {A:12, B:1, C:14, D:13, E:3, F: 4} 

我想找到可以加在一起等於另一個值的所有值。例如。 A + B = D,所以A,B和D會被返回。

+1

如果 「省事」 你的意思是內置的功能,那麼沒有刪除k1 != k2k2 != k3。你必須去比較自己的增加「硬性方法」。 –

+0

方程兩邊是否可以有多個值? (例如,'A + D + B = C + A' - 你想找到這樣的值嗎?)? –

+0

僅供參考,這是不正確的Python字典語法 - 你需要引用你的密鑰,以及你的值,如果他們是字符串。 –

回答

7

使用itertools.combinations

d = {'A':12, 'B':1, 'C':14, 'D':13, 'E':3, 'F': 4} 

import itertools 
for a, b, c in itertools.combinations(sorted(d, key=d.get), 3): 
    if d[a] + d[b] == d[c]: 
     print(a,b,c) 

B E F 
B A D 
B D C 

UPDATE

如果你想重複使用itertools.combinations_with_replacement代替:

d = {'A':1, 'B':2, 'C':4} 

import itertools 
for a, b, c in itertools.combinations_with_replacement(sorted(d, key=d.get), 3): 
    if d[a] + d[b] == d[c]: 
     print(a,b,c) 

A A B 
B B C 

爲什麼sorted使用?

比較x + y == z是沒有意義的,如果xy是比z大。 (假設所有的值都是正整數)。我用sorted來安排數據; x <= y <= z

排序的另一個副作用:如果A + B == C爲True,B + A == C也爲True。但使用sorted,只打印一個。


順便說一句,不要使用dict作爲變量名稱。它陰影內置dict功能。

+0

我認爲重複將被允許,例如,如果'B = 2'然後'B + B = D'。你可能想解釋爲什麼在這裏需要'sorted'。 –

+0

當'key'是'd.get'時,'sorted'如何根據值進行排序?密鑰函數是否會傳遞字典中的實際密鑰? – thefourtheye

+0

@thefourtheye,是的,它做了一個「按價值排序」 –

2

這是很容易的,但不是很有效(確定爲小類型的字典)

>>> D = {'A':12, 'B':1, 'C':14, 'D':13, 'E':3, 'F': 4} 
>>> 
>>> from itertools import product 
>>> for i, j, k in product(D.items(), repeat=3): 
...  if i[1] + j[1] == k[1]: 
...   print "{} + {} = {}".format(i[0], j[0], k[0]) 
... 
A + B = D 
B + A = D 
B + E = F 
B + D = C 
E + B = F 
D + B = C 
+0

它也提供了重複。 – thefourtheye

+0

@thefourtheye,那是我對「所有價值」的解釋。也看到我對falsetru的回答的評論 –

2

這個運行在O(n^2)非病態輸入(例如所有零),而不是O(n^3)像其他答案一樣,並正確處理重複。

def addTriples(d): 
    inverse = {v:[] for v in d.itervalues()} 
    for k, v in d.iteritems(): 
     inverse[v].append(k) 

    for k1, v1 in d.iteritems(): 
     for k2, v2 in d.iteritems(): 
      if k1 != k2: 
       for k3 in inverse.get(v1 + v2,()): 
        if k2 != k3: 
         yield (k1, k2, k3) 

d = {'A':12, 'B':1, 'C':14, 'D':13, 'E':3, 'F':4} 
for triple in addTriples(d): 
    print triple 

,如果你想允許A + A = B和A + B = A

+0

您的代碼效率很高,但會引發語法錯誤。 – falsetru

+0

@falsetru,你是對的。 (這是一個清晰的編輯變得糟糕。)它是固定的。 –

相關問題