是否有將字典中的2個值與所有其他值進行比較的簡單方法? 舉例來說,如果我有一個字典:將字典中的2個值與所有其他值進行比較
dict = {A:12, B:1, C:14, D:13, E:3, F: 4}
我想找到可以加在一起等於另一個值的所有值。例如。 A + B = D,所以A,B和D會被返回。
是否有將字典中的2個值與所有其他值進行比較的簡單方法? 舉例來說,如果我有一個字典:將字典中的2個值與所有其他值進行比較
dict = {A:12, B:1, C:14, D:13, E:3, F: 4}
我想找到可以加在一起等於另一個值的所有值。例如。 A + B = D,所以A,B和D會被返回。
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
是沒有意義的,如果x
或y
是比z
大。 (假設所有的值都是正整數)。我用sorted
來安排數據; x <= y <= z
。
排序的另一個副作用:如果A + B == C
爲True,B + A == C
也爲True。但使用sorted
,只打印一個。
順便說一句,不要使用dict
作爲變量名稱。它陰影內置dict
功能。
我認爲重複將被允許,例如,如果'B = 2'然後'B + B = D'。你可能想解釋爲什麼在這裏需要'sorted'。 –
當'key'是'd.get'時,'sorted'如何根據值進行排序?密鑰函數是否會傳遞字典中的實際密鑰? – thefourtheye
@thefourtheye,是的,它做了一個「按價值排序」 –
這是很容易的,但不是很有效(確定爲小類型的字典)
>>> 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
它也提供了重複。 – thefourtheye
@thefourtheye,那是我對「所有價值」的解釋。也看到我對falsetru的回答的評論 –
這個運行在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
您的代碼效率很高,但會引發語法錯誤。 – falsetru
@falsetru,你是對的。 (這是一個清晰的編輯變得糟糕。)它是固定的。 –
如果 「省事」 你的意思是內置的功能,那麼沒有刪除
k1 != k2
和k2 != k3
。你必須去比較自己的增加「硬性方法」。 –方程兩邊是否可以有多個值? (例如,'A + D + B = C + A' - 你想找到這樣的值嗎?)? –
僅供參考,這是不正確的Python字典語法 - 你需要引用你的密鑰,以及你的值,如果他們是字符串。 –