辞書内の 2 つの値を他のすべての値と比較する簡単な方法はありますか? たとえば、辞書がある場合:
dict = {A:12, B:1, C:14, D:13, E:3, F: 4}
別の値と等しくなるように合計できるすべての値を見つけたいと思います。たとえば、A + B = D の場合、A、B、および D が返されます。
辞書内の 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
アップデート
複製が必要な場合は、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
使用されるのですか?
orが より大きい場合、 x + y
==の比較z
は意味がありません。(すべての値が正の整数であると仮定します)。以前はデータを整理していました。 .x
y
z
sorted
x <= y <= z
並べ替えのもう 1 つの副作用: IfA + B == C
が True の場合、これB + A == C
も True です。しかし、を使用するsorted
と、1つだけが印刷されます。
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^3) ではなく、非病理学的入力 (たとえば、すべてゼロ) で O(n^2) で実行され、重複を正しく処理します。
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
and を削除しますk2 != k3