Skip to main content
 首页 » 编程设计

Python:如何根据某些条件合并和求和列表值

2024年10月01日1bluestorm

我正在使用 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 } 
] 

现在,我的第一个目标是合并列表值并对“order_id”相同的“amount”值求和。所以,结果应该是这样的:

[ 
  { "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”相同的“amount”值求和。另外,我还想从结果中删除“order_id”,因为那样它就无关紧要了。所以,结果应该是这样的:

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

我应该怎么做?

请您参考如下方法:

首先,将 get_order_id 定义为用于对输入进行排序的函数和 itertools.groupby 的键(输入可以是未排序的 order_id-wise 和 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}]