2017-02-01 116 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」值。 –