2016-03-21 17 views
0

は、私は、整数として文字列としてキーと値を持つ2つの辞書を持っている:Python:別の辞書に存在しない場合、ある辞書からキーを削除する方法は?

ground = {"url1":1,"url2":2,....} 
prediction = {"url1":5,"url2":3,....} 

私がやりたい事は、それが予測に存在しない場合地面にキーを削除することです。

は、私は私の頭に来た最も簡単な事を書いた:

for key in ground:   
    if key not in prediction: 
     del ground[key] 

をしても、この試みた:

for key in ground: 
    if not key in prediction.keys(): 
     del ground[key] 

どちらも働いていたが。どのようにして目標を達成できますか?

+2

*どのように* *動作しませんでしたか?第二は、少なくとも、私のためにうまく動作します。 –

+0

@DanielRoseman dictionnaryは反復中にサイズを変更できません。これはRuntimeError(Python 2.7上)を発生させます – loutre

+0

最初のものはyesです。しかし、2番目ではありません。 –

答えて

0

dictをループして、同じループ内のキーを削除します。それがうまくいかない理由です。試してみてください:

pred_set = set(prediction.keys()) 
g_set = set(ground.keys()) 
for key in g_set - pred_set: 
    del ground[key] 
0

あなたの第二の試みは、Python 3でのPython 2で正常に動作し、keys()は、ビューではなくリストであるので、最初と同じエラーを与える:辞書を反復処理中にサイズを変更しました。これを修正するには、最初のリストに変換します

ground = {k: ground[k] for k in ground if k in prediction} 

やPythonでground.keys()を使用してground辞書のキーを反復処理:

for key in list(ground.keys()): 
    if key not in prediction: 
    del ground[key] 
+0

ありがとうございます。それは今うまくいきました –

0

あなたは新しい辞書を作成する辞書内包表記を使用することができます2、またはlist(ground.keys())(Python 2でも動作します)。これにより、キーがground辞書から削除されても影響を受けない新しいリストが返されます:

for k in list(ground.keys()): 
    if k not in prediction: 
     del ground[k] 
+0

辞書知識は 'ground = {k:kは地面にkのために地面[k]は予測していなければ}' – loutre

+0

@loutre:Almost。私の元の答えは間違っていたが、論理は逆転している。 – mhawke

+0

はい、あなたは正しいです – loutre

関連する問題