2016-12-16 181 views
-2

我有一些...有問題蟒蛇

[{"countryname": "Republic of Tunisia", "project_name": "TN: DTF Social Protection Reforms Support", "lendprojectcost": 5700000}, 
{"countryname": "Republic of Tunisia", "project_name": "Tunisia: Ecotourism and Conservation of Desert Biodiversity", "lendprojectcost": 9050000}, 
{"countryname": "Republic of Tunisia", "project_name": "Tunisia - Communications for policy reforms", "lendprojectcost": 600000}, 
{"countryname": "Republic of Tunisia", "project_name": "Tunisia - Governance, Opportunities and Jobs DPL", "lendprojectcost": 500000000}] 

我想:

[{"countryname": "Republic of Tunisia", "project_name":all projects, "lendprojectcost":sum(..) }] 

我怎麼能做到這一點? 我用Python/Flask/MongoDB。

+5

請使你的代碼具有python外觀,並帶有變量名稱。我們都是古老的,近視的,穿着玻璃的傢伙,解析原始的JSON真的很痛苦。 – DyZ

+0

使用一些'for'循環來做到這一點。 – furas

+0

你希望你的'all_projects':作爲一個列表,作爲一個字符串等? – DyZ

回答

0

你可以首先通過使用collections.defaultdict創建一個dict對象,用於使每個"countryname"的唯一條目生效。然後將dict轉換爲您想要的響應。

例如:

from collections import defaultdict 

country_project, country_sum = defaultdict(list), defaultdict(int) 

for country in country_list: 
    country_name = country["countryname"] 
    country_project[country_name].append(country['project_name']) 
    country_sum[country_name] += country['lendprojectcost'] 

# Map the `dict` to get desired result using list comprehension 
new_list = [ { 
     'countryname': country, 
     'project_name': country_project[country], 
     'lendprojectcost': country_sum[country]} for country in country_project] 

# OR, via using plain `for` loop as: 
# new_list = [] 
# for country in country_project: 
#  new_list.append({ 
#   'countryname': country, 
#   'project_name': country_project[country], 
#   'lendprojectcost': country_sum[country]}) 

其中country_listmy_list的問題和最終值保持提到的原始列表是期望的結果:

[{ 
    'countryname': 'Republic of Tunisia', 
    'project_name': [ 
     'TN: DTF Social Protection Reforms Support', 
     'Tunisia: Ecotourism and Conservation of Desert Biodiversity', 
     'Tunisia - Communications for policy reforms', 
     'Tunisia - Governance, Opportunities and Jobs DPL' 
    ], 
    'lendprojectcost': 515350000 
}] 
+1

Howabout'new_list = [{'countryname':country,'project_name':country_project [country], 'lendprojectcost':country_sum [country]} for country in country_project]'。列表推導規則。 – DyZ

+0

@DYZ:我認爲這對用戶來說可能太複雜。但在看到您的評論並給出第二個想法之後,我想我應該也提到這一點。更新了答案 –

+0

等一下,什麼是'country_list'? – DyZ

0

身爲熊貓怪胎,我會去一個大熊貓的解決方案:創建從原始數據(我們稱之爲raw)數據幀,做一切必要的聚合,構建另一個詞典:

df = pd.DataFrame(raw) 
result_df = df.groupby('countryname').agg({ 
         'lendprojectcost' : np.sum, 
         'project_name' : lambda col: col.tolist()}) 
result = result_df.reset_index().to_dict(orient="records") 

# [{"countryname":"Republic of Tunisia","project_name":["TN: DTF Social Protection Reforms Support","Tunisia: Ecotourism and Conservation of Desert Biodiversity","Tunisia - Communications for policy reforms","Tunisia - Governance, Opportunities and Jobs DPL"],"lendprojectcost":515350000}] 
0

其他的答案在這裏是偉大的,但這似乎是reduce的一個自然問題。你有一個列表,你想在操作列表中的元素,以降低「減少」列表大小與一個元素相結合:

def update(x, y): 
    x["project_name"].append(y["project_name"]) 
    x["lendprojectcost"] += y["lendprojectcost"] 
    return x 

result = [reduce(update, list_of_dicts, {"countryname": "Republic of Tunisia", 
             "project_name": [], 
             "lendprojectcost": 0})] 

獎金特點:沒有進口所需