data = [(0, 0, {'product_id': 6, 'qty': 1.0}), (0, 0, {'product_id': 8, 'qty': 1.0}), (0, 0, {'product_id': 7, 'qty': 2.0}), (0, 0, {'product_id': 6, 'qty': 1.0}), (0, 0, {'product_id': 8, 'qty': 1.0}), (0, 0, {'product_id': 7, 'qty': 2.0})]
我有这个列表,我想要做的是找到重复的产品ID并将该数量相加并从列表中删除重复的产品ID元素
列表输出应为:
new_data = [(0, 0, {'product_id': 6, 'qty': 2.0}), (0, 0, {'product_id': 8, 'qty': 2.0}), (0, 0, {'product_id': 7, 'qty': 4.0})]
答案 0 :(得分:3)
我认为最简单的方法是为您的产品ID构建字典(map),将数据提取到该字典中,然后构建新的数据列表。例如:
from collections import defaultdict
def mergeQty(data):
qtyMap = defaultdict(float)
for x, y, product in data:
id = product['product_id']
qty = product['qty']
qtyMap[(x, y, id)] += qty
return [(x, y, { 'product_id' : id, 'qty' : qty }) for (x, y, id), qty in qtyMap.iteritems()]
请注意,这将不合并前两个值不同的产品(在您的示例中,它们都是0,我们只能猜测它们的含义)。
编辑:感谢Azat提出defaultdict
建议。
编辑:根据kuro的建议保持未知字段x
和y
完整。
答案 1 :(得分:1)
一线解决方案:
data = [(0, 0, {'product_id': 6, 'qty': 1.0}), (0, 0, {'product_id': 8, 'qty': 1.0}),
(0, 0, {'product_id': 7, 'qty': 2.0}), (0, 0, {'product_id': 6, 'qty': 1.0}),
(0, 0, {'product_id': 8, 'qty': 1.0}), (0, 0, {'product_id': 7, 'qty': 2.0})]
import itertools
import functools
from operator import itemgetter
[functools.reduce(lambda x, y: (x[0], x[1], {'product_id': x[2]['product_id'], 'qty': x[2]['qty'] + y[2]['qty']}), y) for _,y in itertools.groupby(sorted(data, key=lambda x: itemgetter('product_id')(itemgetter(2)(x))),key=lambda x: itemgetter('product_id')(itemgetter(2)(x)))]