2016-04-11 20 views
0

Bir sözlüğün üstesinden gelmeye çalışıyorum ve içindeki sözlüğü ekliyorum. Ama iteritems() kullanarak döngü kullandığımda, sadece bir kez yinelemek ve dış döngüye çıkmak. Python'da oldukça yeniyim ama bence bu kod çalışıyor olmalı.Python: iç içe iteritems döngüsü yalnızca bir kez çalıştır

Neden böyle oluyor?

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() 

çıktısı:

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

Ama beklenen çıktısı:

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

Ben 2,7 @BillBEGUERADJ – pacific01

+0

Eğer ilk birinin içinde bir başka sözlüğü eklemek istediğiniz arkasında mantığı tarif edebilir kullanabilir? –

+0

temel olarak "outlook" anahtarındaki her en derin değeri yinelemek, olasılığını hesaplamak ve "işlenmiş" değişkene geri itmek istiyorum. Yapıyı orijinal @BillBEGUERADJ – pacific01

cevap

2

Sen hata her zaman 'bakış' silmek olmasıydı ve sonunda gördüğünüz 'outlook' sözlüğüne eklenen son giriş. Sorun burada yatıyor

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

Teşekkür ederim, o bölümü özledim – pacific01

0

:

else: 
    processed[k] = {} 

k önceki değeri sonraki öğeye Döngünüzden için hamle olarak yazılır İşte kod düzeltmedir.

burada bu tanımlama ve sorun çözüldü edilmelidir:

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