对列表中每个元组的第一个值求和

时间:2017-02-24 20:15:33

标签: python python-3.x tuples

x = [(5,3), (8, 3), (7, 3), (5, 4), (2, 4), (3, 4)]
d = {}
[d.__setitem__(d.get(key1,0)+key1,key2) for key1,key2 in x]
print(list(d.items()))

我想在元组中添加具有相同第二个值的第一个值。我写了代码,但我无法找到我的错误。 任何想法??

2 个答案:

答案 0 :(得分:2)

__setitem__返回None,你的逻辑也是错的。您需要根据第二个值对商品进行分类,然后将其第一个值加起来。

您可以使用collections.defaultdict()进行分类:

In [13]: x = [(5,3), (8, 3), (7, 3), (5, 4), (2, 4), (3, 4)]

In [16]: from collections import defaultdict

In [17]: d = defaultdict(int)

In [18]: for i, j in x:
   ....:     d[j] += i
   ....:     

In [19]: d
Out[19]: defaultdict(<class 'int'>, {3: 20, 4: 10})

您还可以在词典理解中使用itertools.groupby()

In [28]: from itertools import groupby

In [29]: from operator import itemgetter

In [30]: {k: sum(i for i, _ in g) for k, g in groupby(x, itemgetter(1))}
Out[30]: {3: 20, 4: 10}

请注意,如果您的列表未根据第二项进行排序,则需要在传递给groupby()函数之前根据该第二项对其进行排序。 (在这种情况下,这种解决方案对defaultdict一个人来说效率很低)

答案 1 :(得分:0)

Kasramvd已经告诉你为什么你的方法不起作用。您可以使用itertools.groupby按第二元组元素进行分组,然后将第一个元素与operator.itemgetter相加。

{k: sum(map(itemgetter(0), g)) for k, g in groupby(x, itemgetter(1))}

显然,如果您的列表没有按照当前的第二元组元素进行排序,则必须先排序。

<强>演示

>>> from operator import itemgetter
>>> from itertools import groupby
>>> x = [(5,3), (8, 3), (7, 3), (5, 4), (2, 4), (3, 4)]
>>> {k: sum(map(itemgetter(0), g)) for k, g in groupby(x, itemgetter(1))}
{3: 20, 4: 10}