是否有一种简单的方法可以将字典中的2个值与所有其他值进行比较? 例如,如果我有一个词典:
dict = {A:12, B:1, C:14, D:13, E:3, F: 4}
我想找到所有可以加在一起的值,以等于另一个值。例如。 A + B = D,因此将返回A,B和D.
答案 0 :(得分:7)
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
<强>更新强>
如果您想要重复项,请改用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
功能。
答案 1 :(得分: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
答案 2 :(得分: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
,请移除k1 != k2
和k2 != k3