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()))
我想在元组中添加具有相同第二个值的第一个值。我写了代码,但我无法找到我的错误。 任何想法??
答案 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}