私は現在、自分自身を維持しながら、標準的な変更元から大きなディッシュのリストを半定期的に更新(同期)それに対する更新。最も簡単な説明は、おそらくされている非標準のマージ、: -新しいディクテーションのリストから順序付けされたリストを更新する(優先度マージ)
A
追加キーとしてキャッシュされた値が含まれるように私のプログラムによって更新dictsの私自身のリスト(b
がいくつか定期的に送信される情報です。 (Aはもともとbと同じですが)いくつかのキーが含まれていますが、Aに追加した値はキャッシュされません。keys = ['key1', 'key2']
はAとbの両方のキーのリストですmkey = 'mtime'
は、Aとbの両方が持つ特殊なキーです。 、
基本的にはA.のキャッシュされた値を無効にA
で辞書がb
で辞書と一致した場合、私はb['mtime'] > A['mtime']
ない限り、Aに辞書を維持する必要があります。 dictがA
に表示され、b
に表示されない場合は取り除きますが、b
に表示されていてA
に表示されていない場合はA
に追加します。
私の聖なる目的は、A
のキャッシュされたキーと値のペアを一切失うことではありませんが、それを達成するには問題があります。私の現在のソリューションは、次のようになります -
def priority_merge(A, b, keys, mkey):
retval = []
b_index = 0
for elemA in A:
if b_index >= len(b):
break # No more items in b
elemb = b[b_index]
minA = { k: elemA[k] for k in keys }
minb = { k: elemb[k] for k in keys }
if minA == minb: # Found a match
if elemA[mkey] >= elemb[mkey]:
retval.append(elemA)
else: # Check mkey to see if take b instead
retval.append(elemb)
b_index = b_index + 1
else: # No match, check forward by one
if b_index+1 >= len(b):
continue
elembplus = b[b_index+1]
minb = { k: elembplus[k] for k in keys}
if minA == minb:
retval.append(elemb) # This is a new element
if elemA[mkey] >= elembplus[mkey]:
retval.append(elemA)
else:
retval.append(elembplus)
b_index = b_index + 2
if b_index <= len(b):
retval.extend(b[b_index:])
return retval
これは私が行に複数の付加および/または欠失(b
相対A
へ)を取得しない限り、正常に動作します。したがって、A
に1,2,3,5が含まれていて、b
に1,2,3,4,5が含まれている場合は問題ありませんが、A
に1,2,5および1,が含まれている場合は1,2,3,4,5が表示されます。私は他のケースの下LEN(B)までの検査を行うことができ
はRETVALを作成し、そのマップに基づいて再度繰り返し処理次に、一致する要素をマッピングするA
とb
両方を通して# No match, check forward by one
、又は第一反復ようにコメントしました。これはエラーが起こりやすいようですが(私はその論理的に賢明だと確信していますが、私はそれがバグであると書いていることもかなり確信しています)。私の2つのアイデアであろうとなかろうと、この問題に取り組むのに適切なアルゴリズムを推奨してください。
あなたのdict http://stackoverflow.com/questions/9835668/python-dictionary-keyswhich-are-class-objects-comparison-with-multiple-compareをハッシュし、設定を適用することができハッシュされたdictのリストに対する操作。 –
ありがとう@AliSAIDOMARしかし、優先順位マージのアルゴリズムに関する私の質問には答えません。ハッシュは、比較自体をより効率的にするためのもので、比較自体に問題はありません(コード例を参照)。 –