-1

2 つの辞書 (Python) があり、値 (キーではない) に基づいてマージしています。ただし、私のアプローチは非常に非効率的で、本質的に O(n^2) です。それについてもっと良い方法はありますか?

この場合のディクショナリは本質的に整数キーであり、値はタプル (5 要素長) であり、すべて整数です。

ありがとう!

例:

辞書 A:{25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}

辞書 B: {46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}.

マージされた辞書は次のとおり{25: (1, 5, 1, 5), 34: (5, 24, 5, 24), 29: (5, 23, 1, 5)}です。辞書 A の最初の要素には、辞書 B の最初の要素と同じ値のタプルがあるため、1 つだけを選択することに注意してください。

4

3 に答える 3

1

多分このような何か?

a = {25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}
b = {46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

for k, v in b.items ():
    if v not in a.values (): a [k] = v

print (a)

しかし、それでもO(n ** 2)だと思います。

編集:これは大きな辞書の方が速いはずです:

c = {}
for k, v in a.items (): c [v] = k
for k, v in b.items (): c [v] = k

c = dict ( (b, a) for a, b in c.items () )
print (c)
于 2013-03-03T21:27:14.113 に答える
1

私はおそらくこのようなことをするでしょう:

from collections import defaultdict

A = {25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}
B = {46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

vk = defaultdict(list)
sources = A, B
for source in sources:
    for k,v in source.iteritems():
        vk[v].append(k)

out = {v[0]:k for k,v in vk.iteritems()}

これは常に最も早いキーを取り、sources生成します

>>> out
{25: (1, 5, 1, 5), 34: (5, 24, 5, 24), 29: (5, 23, 1, 5)}

vk[v].append(k)メモリが問題になる場合は、行を変更できます。今のところ、それは必要のない中間構造を構築していますが、衝突の場合の正しい選択ロジックがどうあるべきか完全にはわかりません。

于 2013-03-03T21:28:53.370 に答える
1

私にとってうまくいくのは

C={v:k for k,v in {v:k for k, v in B.items()+A.items()}.iteritems()}

O(n*log(n))..これはコンパクトなコードであり、辞書に挿入するだけなので、おそらく と同じくらい高価です。

于 2013-03-03T21:36:46.390 に答える