检测词典列表中的相同键值并合并它们

时间:2017-06-28 20:48:19

标签: python list python-3.x dictionary python-3.5

我有一个列表,在列表中我有相同键值的词典。代码应检测重复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}]

3 个答案:

答案 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)]

答案 1 :(得分:0)

做:

root

输出:

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)

答案 2 :(得分:0)

此解决方案仅迭代l一次,它还会按计数对l进行排序,但您可以根据需要对其进行排序,并重新分配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)

如果你想整齐地打印出词典:

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
--------------------------------------------------