2016-03-21 8 views
0

Ich habe zwei Wörterbücher mit Schlüssel als String und Werte als integer:Python: wie Schlüssel aus einem Wörterbuch zu löschen, wenn es nicht in einem anderen Wörterbuch vorhanden ist?

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

Das, was ich tun möchte, ist Schlüssel in Boden zu löschen, wenn sie nicht in Vorhersage existiert.

Ich schrieb die einfachste Sache, die mir in den Sinn kam:

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

und auch versucht, dies:

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

Weder gearbeitet. Wie kann ich das Ziel erreichen?

+2

Haben * nicht funktionieren, wie *? Die zweite funktioniert zumindest gut für mich. –

+0

@DanielRoseman dictionary kann seine Größe während der Iteration nicht ändern. Dies führt zu einem RuntimeError (auf Python 2.7) – loutre

+0

Der erste tut, ja. Aber nicht die zweite. –

Antwort

0

Sie führen eine Schleife über das Diktat und löschen einen Schlüssel in der gleichen Schleife. Deshalb funktioniert es möglicherweise nicht. Versuchen:

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

Ihr zweiter Versuch funktioniert in Python 2. In Python 3 keys() ist eine Ansicht, anstatt eine Liste, so würde die gleichen Fehler wie der erste: Größe des Wörterbuchs während der Iteration verändert. Um dies zu beheben, wandeln sie zunächst in eine Liste:

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

Danke. Es funktionierte jetzt gut –

0

Sie könnten ein Wörterbuch Verständnis verwenden, um ein neues Wörterbuch zu erstellen:

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

Oder iterieren über die Tasten des ground Wörterbuch mit ground.keys() in Python 2 oder list(ground.keys()) in Python 3 (funktioniert auch in Python 2). Dies gibt eine neue Liste, die nicht beeinträchtigt wird, wenn Schlüssel aus dem ground Wörterbuch entfernt werden:

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

Dictionnary Verständnis sollte sein "Boden = {k: Boden [k] für k in Boden, wenn k nicht in der Vorhersage}' – loutre

+0

@loutre: Fast. Meine ursprüngliche Antwort war falsch, aber deine Logik ist umgekehrt. – mhawke

+0

ja du hast Recht – loutre