2016-04-11 12 views
0

Ich versuche, ein Wörterbuch zu durchlaufen und ein Wörterbuch darin anzuhängen. Aber wenn ich eine Schleife mit iteritems() verwende, wird sie nur einmal durchlaufen und zur äußeren Schleife zurückkehren. Ich bin ziemlich neu in Python, aber ich denke, dass dieser Code funktionieren sollte.Python: verschachtelte Iteritems-Schleife nur einmal ausgeführt

Warum das passieren?

from __future__ import division 
import numpy 
import pprint 

training = {"outlook":{"sunny":{"yes":2,"no":3},"overcast":{"yes":4,"no":0},"rainy":{"yes":3,"no":2}},\ 
      "temperature":{"yes":[83,70,68,64,69,75,75,72,81],"no":[85,80,65,72,71]},\ 
      "humidity":{"yes":[86,96,80,65,70,80,70,90,75],"no":[85,90,70,95,91]},\ 
      "windy":{"false":{"yes":6,"no":2},"true":{"yes":3,"no":3}},\ 
      "play":{"yes":9,"no":5}} 
processed = {} 
total_yes = training["play"]["yes"] 
total_no = training["play"]["no"] 
total_all = training["play"]["no"]+training["play"]["yes"] 

def main(): 
    for k,v in training.iteritems(): 
     if(k != "play"): 
      for k2,v2 in v.iteritems(): 
       if((k2 == "yes") & isinstance(v2,list)): 
        processed[k] = {"yes":{"mean":numpy.mean(v2),"std":numpy.std(v2,ddof=1)}} 
       elif((k2 == "no") & isinstance(v2,list)): 
        processed[k].update({"no":{"mean":numpy.mean(v2),"std":numpy.std(v2,ddof=1)}}) 
       else: 
        processed[k] = {} 

        # the problems start here 
        for i,j in v2.iteritems(): 
         if(i == "yes"): 
          p_yes = j/total_yes 
          processed[k].update({k2:{"yes":p_yes,"no":(1-p_yes)}}) 
         #when I print processed[k], it contains current value only (not including previous value) 
       #suddenly exit after iterating once 

     else: 
      processed[k] = {"yes":total_yes/total_all,"no":total_no/total_all} 

    pp = pprint.PrettyPrinter(indent=3) 
    pp.pprint(processed) 

if __name__ == '__main__': 
    main() 

Die Ausgabe lautet:

... 
'outlook': { 'sunny': { 'no': 0.7777777777777778, 
          'yes': 0.2222222222222222}}, 
... 

Aber erwartete Ausgabe ist:

... 
'outlook': { 'sunny': { 'no': 0.7777777777777778, 
          'yes': 0.2222222222222222}}, 
       'overcast': { 'no':xxxxx, 
          'yes':xxx 
          } 
       ... 
... 
+0

Ich benutze 2.7 @BillBEGUERADJ – pacific01

+0

Können Sie die Logik hinter dem Sie ein anderes Wörterbuch innerhalb der ersten eingefügt werden soll beschreiben? –

+0

Grundsätzlich möchte ich jeden tiefsten Wert im "Outlook" -Schlüssel iterieren, seine Wahrscheinlichkeit berechnen und ihn zurück in "verarbeitete" Variable schieben. Ich mache das, um die Struktur unverändert zu lassen Original @BillBEGUERADJ – pacific01

Antwort

2

Sie sind Fehler war, dass Sie immer den ‚Ausblick‘ löschen und am Ende sehen Sie die letzter Eintrag, der in das Outlook-Wörterbuch eingefügt wurde. Hier ist ein Update des Codes:

from __future__ import division 
import numpy 
import pprint 

training = {"outlook":{"sunny":{"yes":2,"no":3},"overcast":{"yes":4,"no":0},"rainy":{"yes":3,"no":2}},\ 
     "temperature":{"yes":[83,70,68,64,69,75,75,72,81],"no":[85,80,65,72,71]},\ 
     "humidity":{"yes":[86,96,80,65,70,80,70,90,75],"no":[85,90,70,95,91]},\ 
     "windy":{"false":{"yes":6,"no":2},"true":{"yes":3,"no":3}},\ 
     "play":{"yes":9,"no":5}} 
processed = {} 
total_yes = training["play"]["yes"] 
total_no = training["play"]["no"] 
total_all = training["play"]["no"]+training["play"]["yes"] 


def main(): 
    for k,v in training.iteritems(): 
     if (k=='outlook'): 
      pass 
     if(k != "play"): 
      for k2,v2 in v.iteritems(): 
       if((k2 == "yes") & isinstance(v2,list)): 
        processed[k] = {"yes":{"mean":numpy.mean(v2),"std":numpy.std(v2,ddof=1)}} 
       elif((k2 == "no") & isinstance(v2,list)): 
        processed[k].update({"no":{"mean":numpy.mean(v2),"std":numpy.std(v2,ddof=1)}}) 
       else: 
        if k not in processed: 
         processed[k] = {} 

        for i,j in v2.iteritems(): 
         if(i == "yes"): 
          p_yes = j/total_yes 
          processed[k].update({k2:{"yes":p_yes,"no":(1-p_yes)}})      


     else: 
      processed[k] = {"yes":total_yes/total_all,"no":total_no/total_all} 

    pp = pprint.PrettyPrinter(indent=3) 
    pp.pprint(processed) 

if __name__ == '__main__': 
    main() 
+0

danke, ich habe diesen Teil verpasst – pacific01

0

Das Problem hier liegt:

else: 
    processed[k] = {} 

Der vorherige Wert von k wird überschrieben als for-Schleife bewegt sich auf das nächste Element.

diese hier definieren und Ihr Problem gelöst werden soll:

for k,v in training.iteritems(): 
    if(k != "play"): 
     processed[k] = {} 
Verwandte Themen