2017-02-01 6 views
2

私はPython 3.6を使用しています。Python:いくつかの基準に基づいてANDリストの値をマージする方法

[ 
    { "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」は、同じである「量」の値を合計することです:私はこのようなAPIコールからいくつかの結果がきました。

[ 
    { "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」「量」の値を合計する場合は、この結果を得ることと同じである:だから、結果はこのようなものでなければなりません。また、結果から「order_id」を削除したいので、それは無関係です。結果は次のようになります。

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

どうすればよいですか?

+0

あなたがコーディングにしようとした何をしましたか? –

+0

私は入れ子状態の "for in"ループステートメントを考えていましたが、 "for in"ループが発生するたびに単一のリスト値にしかアクセスできないので、正しい方法ではないと思います。 –

答えて

2

まず、ちょうど再構築、

は一度グループ化された(入力がソートされていないORDER_IDワイズとgroupby可能性があり、その場合には正しく動作しないでしょう)あなたの入力とitertools.groupbyのキーとしてソートに使用関数としてget_order_idを定義します簡略化された辞書のリスト。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」には「item_id」値ではなく「order_id」値があります。 –

関連する問題