我正在使用python 3.6。我有一些像这样的API调用的结果:
[
{ "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 }
]
现在,我的第一个目标是合并列表值并总和“金额”值WHERE“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 }
]
有一次,我现在得到这个结果我想合并这个新的列表值并且总和“金额”值WHERE“item_id”是相同的。加上我还想从结果中删除“order_id”,因为那时它将无关紧要。所以,结果应该是这样的:
[
{ "item_id": 17811608, "amount": 30.74 },
{ "item_id": 13397933, "amount": 17.34 }
]
我该怎么做?
答案 0 :(得分:2)
首先,将get_order_id
定义为用于对输入进行排序的函数,并将其定义为itertools.groupby
的键(输入可能是未排序的order_id-wise而groupby
无法正常工作情况下)
分组后,只需重建简化字典列表,其中order_id
和amount
为关键字,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}]