2013-11-15 78 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。 –