2016-04-11 51 views
0

我想循環一個字典,並在其中添加字典。但是當我使用循環使用iteritems()時,它只是迭代一次並退出到外部循環。我在Python中很新,但我認爲這個代碼應該工作。Python:嵌套iteritems循環只能運行一次

爲什麼會發生這種情況?

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

輸出是:

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

但預期輸出是:

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

我用2.7 @BillBEGUERADJ – pacific01

+0

你能描述一下它的後面要插入的第一個內部的其他字典中的邏輯是什麼? –

+0

基本上我想迭代「outlook」鍵中的每個最深值,計算其概率,並將其推回「已處理」變量。我這樣做是爲了保持結構與原來的一樣@BillBEGUERADJ – pacific01

回答

2

你的錯誤是,你總是刪除「前景」,到最後你看到的插入到'outlook'字典中的最後一個條目。這裏是你的代碼的修復:

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

謝謝,我錯過了那部分 – pacific01

0

的問題就在這裏:

else: 
    processed[k] = {} 

k的前值被改寫爲您的for循環移動到下一個元素。

這裏定義這一點,你的問題應該得到解決:

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