2013-11-15 49 views
1

我有一段代码试图使用一系列for循环将字典从一种嵌套格式转换为另一种嵌套格式,以便我可以轻松地将字典导出为CSV文件。但是,由于我的脚本循环输入字典,它会覆盖输出字典,而不是附加额外的值,我不明白为什么。为什么这个词典在for循环中覆盖自己?

这里是输入字典的格式:

{'data': [{'title': 'Lifetime Likes by Country', 
      'values': [{'end_time': '2013-11-10T08:00:00+0000', 
         'value': {'IN': 343818, 'PK': 212632, 'US': 886367}}, 
         {'end_time': '2013-11-11T08:00:00+0000', 
         'value': {'IN': 344025, 'US': 886485}}]}, 
      {'title': 'Daily Country: People Talking About This', 
      'values': [{'end_time': '2013-11-10T08:00:00+0000', 
         'value': {'IN': 289, 'US': 829}}, 
         {'end_time': '2013-11-11T08:00:00+0000', 
         'value': {'IN': 262, 'US': 836}}]}]} 

这里是我的代码:

input_dict = function_to_get_input_dict() 
filtered_dict = {} 
for metric in input_dict['data']: 
    for day in metric['values']: 
     parsed_date = parser.parse(day['end_time']) 
     date_key = parsed_date.strftime('%m/%d/%Y') 
     filtered_dict[date_key] = {} 
     filtered_dict[date_key]['Total %s' % metric['title']] = 0 
     for k, v in day['value'].iteritems(): 
      filtered_dict[date_key]['%s : %s' % (metric['title'], k)] = v 
      filtered_dict[date_key]['Total %s' % metric['title']] += v 
pprint(filtered_dict) #debug 

预计输出字典格式:

{date1:{metric_1_each_country_code:value, metric_1_all_country_total:value, metric_2_each_country_code:value, metric_2_all_country_total:value}, date2:{etc}}

然而,代替我获取每个日期只有一个度量的输出字典: {date1:{metric_2_each_country_code:value, metric_2_all_country_total:value}, date2:{etc}}

这似乎是覆盖指标的关键:每一时间值对,我不明白,因为关键的应该是唯一的每个度量使用['%s : %s' % (metric['title'], k)]公式,所以他们不应该被覆盖。

我错过了什么?

回答

1

如果您在代码中注意到,在第二个for循环中您有filtered_dict[date_key] = {}。这会重置filtered_dict[date_key]的值,而不允许您添加它。

input_dict = function_to_get_input_dict() 
filtered_dict = {} 
for metric in input_dict['data']: 
    for day in metric['values']: 
     parsed_date = parser.parse(day['end_time']) 
     date_key = parsed_date.strftime('%m/%d/%Y') 
     filtered_dict[date_key] = {} 
     filtered_dict[date_key]['Total %s' % metric['title']] = 0 
     for k, v in day['value'].iteritems(): 
      filtered_dict[date_key]['%s : %s' % (metric['title'], k)] = v 
      filtered_dict[date_key]['Total %s' % metric['title']] += v 
pprint(filtered_dict) #debug 
+0

没错,这就是问题所在。谢谢。 但是,当我发表评论时,我得到一个关键错误,因为我没有告诉Python我要在字典中嵌套字典。在不覆盖嵌套字典的情况下做到这一点的最佳方法是什么? –

0

我认为一个问题是,你的数据有语法错误,它几乎不可能看到结构。我已经修正了它,并且印刷了所有内容以帮助您更好地了解其结构。不是一个完整的答案,但它会朝着帮助解决这个问题很长的路要走:

import pprint; pprint.pprint({"data": [{ "values": [{ "value": { "US": 886367, "IN": 343818, "PK": 212632}, "end_time": "2013-11-10T08:00:00+0000"},{"value": { "US": 886485, "IN": 344025}, "end_time": "2013-11-11T08:00:00+0000"}], "title": "Lifetime Likes by Country"}, {"values": [{"value": { "US": 829, "IN": 289}, "end_time": "2013-11-10T08:00:00+0000"},{"value": {"US": 836,"IN": 262}, "end_time": "2013-11-11T08:00:00+0000"}], "title": "Daily Country: People Talking About This"}]}) 
{'data': [{'title': 'Lifetime Likes by Country', 
      'values': [{'end_time': '2013-11-10T08:00:00+0000', 
         'value': {'IN': 343818, 'PK': 212632, 'US': 886367}}, 
         {'end_time': '2013-11-11T08:00:00+0000', 
         'value': {'IN': 344025, 'US': 886485}}]}, 
      {'title': 'Daily Country: People Talking About This', 
      'values': [{'end_time': '2013-11-10T08:00:00+0000', 
         'value': {'IN': 289, 'US': 829}}, 
         {'end_time': '2013-11-11T08:00:00+0000', 
         'value': {'IN': 262, 'US': 836}}]}]} 

现在,我可以看到你的数据,或许这类型的数据结构的性质,将更好地满足您的需求:

import pprint; pprint.pprint({'Daily Country: People Talking About This': {'2013-11-11T08:00:00+0000': {'US': 836, 'IN': 262}, '2013-11-10T08:00:00+0000': {'US': 829, 'IN': 289}}, 'Lifetime Likes by Country': {'2013-11-11T08:00:00+0000': {'US': 886485, 'IN': 344025}, '2013-11-10T08:00:00+0000': {'PK': 212632, 'US': 886367, 'IN': 343818}}}) 

它给你:

{'Daily Country: People Talking About This': {'2013-11-10T08:00:00+0000': {'IN': 289, 
                      'US': 829}, 
               '2013-11-11T08:00:00+0000': {'IN': 262, 
                      'US': 836}}, 
'Lifetime Likes by Country': {'2013-11-10T08:00:00+0000': {'IN': 343818, 
                  'PK': 212632, 
                  'US': 886367}, 
           '2013-11-11T08:00:00+0000': {'IN': 344025, 
                  'US': 886485}}} 
+0

谢谢 - 在这种情况下,我在我的代码中实际使用的字典没有错误,只是当我试图简化在我的SO问题中使用的字典时,我犯了一些错误...原始输入字典格式正确的JSON。 –