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()))
我想在具有相同第二個值的元組中添加第一個值。我寫了代碼,但我無法找到我的錯誤。 任何想法??總結列表中每個元組的第一個值
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()))
我想在具有相同第二個值的元組中添加第一個值。我寫了代碼,但我無法找到我的錯誤。 任何想法??總結列表中每個元組的第一個值
__setitem__
返回無,您的邏輯也是錯誤的。您需要根據第二個值對項目進行分類,然後將其第一個值相加。
可以使用collections.defaultdict()
進行分類:
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}
請注意,如果您的列表是沒有排序基於第二個項目,你需要:
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()
在傳遞給groupby()
函數之前,根據第二項進行排序。 (在這種情況下,這種解決方案對於defaultdict
之一效率會非常低)
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}
你想要做什麼,並且不知道你的解釋是比代碼或周圍的其他方式:)請詳細說明,更多的添加的例子更混亂,我不明白你想要達到的效果 – bosnjak
在列表理解中使用'__setitem__'應該尖叫「這是錯誤的方法」 –
請提供預期的輸出以便問題更清晰。 – Sangharsh