2016-08-19 2 views
0

Ich habe etwas Code, den ich analysiere. Aber ich habe festgestellt, dass das Iterieren über ein Wörterbuch es leert. Ich habe das Problem behoben, indem ich eine Deepcopy des Dictionarys mache und in einem Code, der die Werte anzeigt, darüber iteriere und später das ursprüngliche Dictionary verwende, um darüber zu iterieren, um einem 2D-Array Werte zuzuweisen. Warum wird das ursprüngliche Wörterbuch überstrichen, um es anzuzeigen, so dass es später unbrauchbar ist, da es jetzt leer ist? Alle Antworten sind willkommen.Python iterieren über Wörterbuch leert es

import copy 

# This line fixed the problem 
trans = copy.deepcopy(transitions) 

print ("\nTransistions = ") 
# Original line was: 
# for state, next_states in transitions.items(): 
# Which empties the dictionary, so not usable after that 

for state, next_states in trans.items(): 
    for i in next_states: 
     print("\nstate = ", state, " next_state = ", i) 

# Later code which with original for loop showed empty dictionary 
for state, next_states in transitions.items(): 
    for next_state in next_states: 
     print("\n one_step trans state = ", state, " next_state = ", next_state) 
     one_step[state,next_state] += 1 

Ein Druck des Wörterbuchs:

Transistions = 
{0: <map object at 0x0000000003391550>, 1: <map object at 0x00000000033911D0>, 2: <map object at 0x0000000003391400>, 3: <map object at 0x00000000033915F8>, 4: <map object at 0x0000000003391320>} 

Typ:

Transistions = 
<class 'dict'> 

Edit: Hier ist der Code, die Karte verwendet. Irgendwelche Vorschläge, wie man es bearbeitet, um das Wörterbuch zu erstellen, ohne Karte zu verwenden?

numbers = dict((state_set, n) for n, state_set in enumerate(sets)) 

transitions = {} 
for state_set, next_sets in state_set_transitions.items(): 
    dstate = numbers[state_set] 
    transitions[dstate] = map(numbers.get, next_sets) 
+1

Iterieren über einen dict Leert es nicht. Du hast einen anderen Fehler. – user2357112

+0

Was ist die Art von 'Übergängen'? Bist du sicher, dass es ein Wörterbuch ist? Probiere 'print (tippe (Übergänge))' und füge das Ergebnis ein. –

Antwort

1

Das Iterieren über ein Diktat wird nicht gelöscht. Iterieren über eine Map Iterator leert es.

Überall dort, wo Sie Ihre transitions dict erzeugt, sollten Sie eine Liste Verständnis statt map auf Listen zu erstellen, anstatt von Iteratoren für die Werte verwendet:

[whatever for x in thing] 

statt

map(lambda x: whatever, thing) 
+0

OK. Vielen Dank. Ich analysiere einen Code, den jemand anders erstellt hat, also habe ich bemerkt, dass er/sie in anderen Teilen des Codes eine Karte verwendet hat. Vielleicht sollte diese Person nicht haben. Ich werde sehen, ob ich den Code bearbeiten kann, um das Wörterbuch wie beschrieben zu generieren. Würde es irgendwelche Unterschiede im Code und der Leistung geben, wenn ich das tun würde, was Sie vorschlagen? – te7

+0

@ te7: Die Codeunterschiede wären einfach und sahen so aus, wie ich es oben gezeigt habe. Es wird Leistungsunterschiede geben; Positiv oder negativ, Sie sollten sich keine Sorgen um sie machen. Es ist im Grunde nie sinnvoll, die Leistung von Arbeitscode und falschem Code zu vergleichen. – user2357112

+0

@ user2357112 Ok. Vielen Dank. Siehe meine Bearbeitung – te7

Verwandte Themen