我想循環一個字典,並在其中添加字典。但是當我使用循環使用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
}
...
...
我用2.7 @BillBEGUERADJ – pacific01
你能描述一下它的後面要插入的第一個內部的其他字典中的邏輯是什麼? –
基本上我想迭代「outlook」鍵中的每個最深值,計算其概率,並將其推回「已處理」變量。我這樣做是爲了保持結構與原來的一樣@BillBEGUERADJ – pacific01