繁体   English   中英

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

[英]Comparing 2 values in dict to all other values

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

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

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

使用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

更新

如果要复制,请使用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

如果xy大于z ,则比较x + y == z是没有意义的。 (假设所有值都是正整数)。 我使用sorted来排列数据; x <= y <= z

排序的另一个副作用:如果A + B == C为True,则B + A == C也为True。 但是使用sorted ,仅打印一个。


顺便说一句,不要使用dict作为变量名。 它隐藏了内置的dict函数。

这很简单,但效率不高(适合小词典)

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

它在非病理输入(例如全零)上以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 != k2k2 != k3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM