キーパターンが他のdictキーと一致する場合、Python dictkeydelete。
例えば
a={'a.b.c.test':1, 'b.x.d.pqr':2, 'c.e.f.dummy':3, 'd.x.y.temp':4}
b={'a.b.c':1, 'b.p.q':20}
結果
a={'b.x.d.pqr':2,'c.e.f.dummy':3,'d.x.y.temp':4}`
キーパターンが他のdictキーと一致する場合、Python dictkeydelete。
例えば
a={'a.b.c.test':1, 'b.x.d.pqr':2, 'c.e.f.dummy':3, 'd.x.y.temp':4}
b={'a.b.c':1, 'b.p.q':20}
結果
a={'b.x.d.pqr':2,'c.e.f.dummy':3,'d.x.y.temp':4}`
「他のdictキーとのパターンマッチ」が「他のdictの任意のキーで始まる」を意味する場合、それを書く最も直接的な方法は次のようになります。
a = {k:v for (k, v) in a.items() if any(k.startswith(k2) for k2 in b)}
一見それを理解するのが難しい場合、それは基本的にこれと同等です:
def matches(key1, d2):
for key2 in d2:
if key1.startswith(key2):
return True
return False
c = {}
for key in a:
if not matches(key, b):
c[key] = a[key]
a = c
これは必要以上に遅くなります。a
N個のキーがあり、 M個のキーがある場合b
、かかる時間はO(NM)です。「キーk
はdictに存在しますかb
」を常にチェックできますが、dict全体を反復処理せずに「キーk
がdictに存在するか」をチェックする方法はありません。b
したがって、b
が潜在的に大きい場合はsorted(b.keys())
、バイナリ検索を検索して記述します。これにより、時間がO(N log M)になります。ただし、これがボトルネックでない場合は、単純であるという理由だけで、単純なバージョンを使用する方がよい場合があります。
a
一致を削除するのではなく、一致を除外して新しいものを生成していることに注意してください。これは、複数の理由から、ほとんどの場合、インプレースで削除するよりも優れたソリューションです。*推論する方がはるかに簡単です。オブジェクトを不変として扱い、それらに対して純粋な操作を行うことは、状態が時間の経過とともにどのように変化するかを考える必要がないことを意味します。たとえば、その場で削除する単純な方法では、辞書を繰り返し処理しているときに辞書を変更しているという問題が発生し、例外が発生します。このような問題は、変更可能な操作なしでは発生しません。*読みやすく、(一度コツをつかめば)書くことさえ簡単です。*ほとんどの場合高速です。
1つのトレードオフは、メモリ使用量です。インプレース削除の実装では、すべてのキーのコピーを作成する必要があります。build-a-new-dict実装では、フィルター処理されたdictと元のdictの両方がメモリー内にある必要があります。値の99%を保持していて、値がキーよりもはるかに大きい場合、これはあなたを傷つける可能性があります。(一方、値の10%を保持し、値がキーとほぼ同じサイズである場合は、実際にスペースを節約できます。)そのため、「ほとんどの場合」、よりも優れたソリューションです。 "いつも"。
for key in list(a.keys()):
if any(key.startswith(k) for k in b):
del a[key]
key.startswith(k)
「一致」するための適切な条件に置き換えます。
c={} #result in dict c
for key in b.keys():
if all([z.count(key)==0 for z in a.keys()]): #string of the key in b should not be substring for any of the keys in a
c[key]=b[key]