2016-12-16 183 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})] 

奖金特点:没有进口所需