2017-02-01 57 views
2

我正在使用python 3.6。我有一些结果,从这样的API调用:Python:如何基于某些条件合并和列表值

[ 
    { "order_id": 51128352, "item_id": 17811608, "amount": -1.74 }, 
    { "order_id": 51128352, "item_id": 17811608, "amount": 13.88 }, 
    { "order_id": 50290147, "item_id": 17811608, "amount": -1.74 }, 
    { "order_id": 50290147, "item_id": 17811608, "amount": 20.34 }, 
    { "order_id": 50320149, "item_id": 13397933, "amount": -5.78 }, 
    { "order_id": 50320149, "item_id": 13397933, "amount": 23.12 } 
] 

现在,我的第一个目标是要合并列表中值,并总结了“量”值,其中“ORDER_ID”是一样的。所以,结果应该是这样的:

[ 
    { "order_id": 51128352, "item_id": 17811608, "amount": 12.14 }, 
    { "order_id": 50290147, "item_id": 17811608, "amount": 18.6 }, 
    { "order_id": 50320149, "item_id": 13397933, "amount": 17.34 } 
] 

有一次,我现在我想合并这个新的列表值,并总结了“量”值,其中“ITEM_ID”得到这样的结果是一样的。 PLUS我也想从结果中删除“order_id”,因为那样它就无关紧要了。所以,结果应该是这样的:

[ 
    { "item_id": 17811608, "amount": 30.74 }, 
    { "item_id": 13397933, "amount": 17.34 } 
] 

我应该怎么做?

+0

那你在编码试过吗? –

+0

我正在考虑嵌套条件的“for in”循环语句,但我不认为这是正确的方式,因为在每次出现“for in”循环内我们都只能访问单个列表值。 –

回答

2

首先,定义get_order_id如用来排序您输入的功能和一键itertools.groupby(输入可以是无序的order_id明智和groupby不会在这种情况下正常工作)

一旦分组,只是重建一个简化的字典列表,其中order_idamount作为关键字,以及amount值的总和。

l = [ 
    { "order_id": 51128352, "item_id": 17811608, "amount": -1.74 }, 
    { "order_id": 50290147, "item_id": 17811608, "amount": -1.74 }, 
    { "order_id": 50290147, "item_id": 17811608, "amount": 20.34 }, 
    { "order_id": 50320149, "item_id": 13397933, "amount": -5.78 }, 
    { "order_id": 51128352, "item_id": 17811608, "amount": 13.88 }, 
    { "order_id": 50320149, "item_id": 13397933, "amount": 23.12 } 
] 

import itertools 

get_order_id = lambda x : x["order_id"] 

result = [{'amount': sum(x['amount'] for x in r), 'item_id' : k} 
      for k,r in itertools.groupby(sorted(l,key=get_order_id),key=get_order_id)] 

print(result) 

结果:

[{'amount': 18.6, 'item_id': 50290147}, {'amount': 17.34, 'item_id': 50320149}, {'amount': 12.14, 'item_id': 51128352}] 
+0

感谢您的回答。它似乎工作,但是,结果中的“item_id”具有“order_id”值而不是“item_id”值。 –