我有一个列表,在列表中我有相同键值的词典。代码应检测重复item_no
并应合并字典(将价格和计数加在一起)。 Python版本是3.5。
[{'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 :(得分: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
--------------------------------------------------