2015-02-09 174 views
0

我需要将一个结构的JSON数据转换为另一个结构,我可以使用它来生成NvD3图表。在过去的几天里,我一直在问和阅读要做到这一点,并取得了部分解决方案。它将工作,除非我再添加一个键/值到“data_json”字典。Python Json for循环

最奇怪的是,尽管引用“datos_TEU”的行被注释了,但它仍然将值分配给该字典条目并且不知道为什么。即使我只是取消注释第一个循环,它将以与其他键相同的数据结束。所以我最终得到2个不同的密钥中插入的相同数据的副本。除此之外,我不断重复数据或在循环中“重叠”。

当然,我正在做一个大的noob错误,但我无法看到它。我一直在打印所有的东西,尝试不同的东西整个上午和下午,但我无法捕捉到错误。

data = json.load(url_obj) 
tarifas = ('2.0A','2.0DHA','2.0DHSA') 
fecha = '12345' #Just to develop 
terminos = ('Dia','Hora','GEN','NOC','VHC','COFGEN','COFNOC','COFVHC','PMHGEN','PMHNOC','PMHVHC','SAHGEN','SAHNOC','SAHVHC','FOMGEN','FOMNOC','FOMVHC','FOSGEN','FOSNOC','FOSVHC','INTGEN','INTNOC','INTVHC','PCAPGEN','PCAPNOC','PCAPVHC','TEUGEN','TEUNOC','TEUVHC') 


data_json = {'datos_TOT':[],'datos_TEU':[],'Fecha':fecha} 

for i,tarifa in enumerate(tarifas): 
    tarifas_dicc= {'tarifa':tarifa} 
    tarifas_dicc['data'] = [] #Clean and create a new empty one. 
    data_json['datos_TOT'].append(tarifas_dicc) 
=> #data_json['datos_TEU'].append(tarifas_dicc) I found that problems start when I uncomment this line. From here on the returned data will have duplicities or data that should´nt be there. 
    list_terminos = terminos[(2+i)::3] #The original data is coded in a single dictionary and I have to split it into 3 different categories. 


    for j in range (0,3): 
     periodo_dicc = {'periodo':'{0}-{1}'.format(j,j+1)} 
     periodo_dicc['data'] = [] #Clean and create a new empty one. 
     #data_json['datos_TEU'][i]['data'].append(periodo_dicc) 
     data_json['datos_TOT'][i]['data'].append(periodo_dicc) 

     for k,termino in enumerate(list_terminos): 
      data_dicc_TOT = {'value':data["PVPC"][j][termino]} #This structure come from the original data_json i´m using 

      data_dicc_TOT['label'] = termino 
      #data_dicc_TEU = {'value':data["PVPC"][j][list_terminos[0]]} 
      #data_dicc_TEU['label'] = list_terminos[0] 
      #data_json['datos_TEU'][i]['data'][j]['data'].append(data_dicc_TEU) 
      data_json['datos_TOT'][i]['data'][j]['data'].append(data_dicc_TOT) 

我在哪里分配数据到另一个键?

回答

0

如果您分配tarifas_diccdatos_TOTdatos_TEU,既类型的字典获取到相同事情的参考。所以当你修改一个时,另一个会看到变化。

只要确保您创建两个单独的字母开头。您可以简化代码的一部分,以及:

for i,tarifa in enumerate(tarifas): 
    data_json['datos_TOT'].append({'tarifa':tarifa, 'data': []} 
    data_json['datos_TEU'].append({'tarifa':tarifa, 'data': []} 

还要注意同样会成为periodo_dicc真正以后。

+0

谢谢!完全noob问题...我没有记得python如何处理这些事情... – XcodeX 2015-02-09 21:42:10