2017-06-28 15 views
0

私はリストを持っています、そのリストの中に私は同じキー値で辞書を持っています。コードは重複item_noを検出し、辞書をマージする必要があります(価格とカウントを加算してください)。 Pythonのバージョンは3.5です。辞書のリストで同じキー値を検出し、それらをマージする

code_capture

[{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748}, 
{'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244}, 
{'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}] 

最終的な結果は次のようになります。

[{'count': 4, 'item_no': 'E-Y12-A6-301', 'price': 2992}, 
{'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}] 
+0

そして、あなたがこれまでに試してみましたか?あなたは、少なくともあなたが記述した結果を作成するために辞書をループしてみましたか?この問題を解決するための問題を示すコードを投稿してください。 – Risadinha

+1

Cool story、bro。 –

+0

ここで質問が表示されません。 –

答えて

2
l = [{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748}, 
    {'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244}, 
    {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}] 

new_l = [{'count': sum(d['count'] for d in l if d['item_no']==item_no), 
      'price': sum(d['price'] for d in l if d['item_no']==item_no), 
      'item_no': item_no} 
     for item_no in set(i['item_no'] for i in l)] 
+0

これは本当に素敵でいいですね、ありがとう! – YoloAcc

+0

あなたがそれを気に入ってよかった、その最も効率的な方法ではなく、もっと** pythonic ** IMHO –

0

の操作を行います。

from pprint import pprint 

l = [{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748}, 
    {'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244}, 
    {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}] 


items = dict() 

for item in l: 
    _id = item['item_no'] 
    if _id not in items: 
     items[_id] = item 
    else: 
     items[_id]['count'] += item['count'] 
     items[_id]['price'] += item['price'] 

nl = list(items.values()) 

pprint(nl) 

出力:

[{'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}, 
{'count': 4, 'item_no': 'E-Y12-A6-301', 'price': 2992}] 
あなたが代わりに新しいリストを作成するあなたがそれをしたい方の値でソートしても、再割り当て lことができますが210
+0

今それは正しいです;) – glegoux

+1

'_idではなく' _idでitems.keys() 'は' _id in items'と書くだけで十分です。 – 9000

0

このソリューション一度lオーバーだけ反復し、それはまた、countでlを並べ替え:

def merge_dicts(list_of_dicts): 
    items = {} 
    for dct in list_of_dicts: 
     item_no = dct['item_no'] 
     if item_no in items: 
      items[item_no]['count'] += dct['count'] 
      items[item_no]['price'] += dct['price'] 
     else: 
      items[item_no] = dct 
    return sorted(items.values(),key=lambda k: k['count']) 

l = [{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748}, 
    {'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244}, 
    {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}] 
l = merge_dicts(l) 
あなたがきちんと辞書を印刷したい場合は

return sorted(items.values(),key=lambda k: k['count'],reverse=True) 

は、あなたは彼らが順番はこの1つで戻りラインを置き換える降順でソートしたい場合

for dct in l: 
    print ("Item No: "+dct['item_no']) 
    print (" Price: "+str(dct['price'])) 
    print (" Count: "+str(dct['count'])) 
    print ("-"*50) 

プリント:

Item No: E-Y12-A6-301 
    Price: 2992 
    Count: 4 
-------------------------------------------------- 
Item No: E-Y13-A3-301 
    Price: 748 
    Count: 1 
-------------------------------------------------- 
関連する問題