从列表和总和中查找重复项

时间:2017-05-29 05:11:52

标签: python python-2.7

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})]

2 个答案:

答案 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的建议保持未知字段xy完整。

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