Python 将dict中的2个值与所有其他值进行比较

Python 将dict中的2个值与所有其他值进行比较,python,dictionary,Python,Dictionary,有没有一种简单的方法可以将字典中的两个值与所有其他值进行比较? 例如,如果我有一个dict: dict = {A:12, B:1, C:14, D:13, E:3, F: 4} 我想找到所有可以加在一起等于另一个值的值。例如,A+B=D,因此将返回A、B和D 这很简单,但效率不高(适用于小型dict) 使用: 更新 如果要复制,请使用itertools.compositions\u和\u replacement: d = {'A':1, 'B':2, 'C':4} import iter

有没有一种简单的方法可以将字典中的两个值与所有其他值进行比较? 例如,如果我有一个dict:

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

我想找到所有可以加在一起等于另一个值的值。例如,A+B=D,因此将返回A、B和D

这很简单,但效率不高(适用于小型dict)

使用:



更新

如果要复制,请使用
itertools.compositions\u和\u 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)

为什么使用
排序的

如果
x
y
大于
z
,则比较
x+y
==
z
是没有意义的。(假设所有值都是正整数)。我使用
排序
来排列数据<代码>x这在非病理输入(例如全零)上以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

删除
k1!=k2
k2!=k3
如果你想允许A+A=B和A+B=A

如果你说的“简单方法”是指内置函数,那么就不允许了。你必须自己比较加法的“艰难方法”。等式两边是否都有多个值?(例如,
A+D+B=C+A
-您想找到这样的值吗)?仅供参考,这不是正确的Python字典语法-您希望在键周围加引号,如果值是字符串,则在其周围加引号。@SeanVieira,这将是一个更有趣的问题,它还提供了重复项。@thefourtheye,这是我对“所有值”的解释。另请参见我对falsetru回答的评论。我假设允许重复,例如如果
B=2
那么
B+B=D
。您可能想解释为什么这里需要
排序
。当
d.get
时,
排序
如何基于值排序?键函数是否会从dict传递实际键?@thefourtheye,是的,它执行“按值排序”@thefourtheye,
d.get
类似于
d[…]
键的返回值
函数用于在排序函数内进行比较。@gnibbler,我添加了一个解释。谢谢你的评论。@falsetru,你是对的。(这是一个为清晰起见而进行的编辑,但效果不佳。)它已修复。
B E F
B A D
B D C
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
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