2017-02-24 120 views
0
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())) 

我想在具有相同第二個值的元組中添加第一個值。我寫了代碼,但我無法找到我的錯誤。 任何想法??總結列表中每個元組的第一個值

+1

你想要做什麼,並且不知道你的解釋是比代碼或周圍的其他方式:)請詳細說明,更多的添加的例子更混亂,我不明白你想要達到的效果 – bosnjak

+1

在列表理解中使用'__setitem__'應該尖叫「這是錯誤的方法」 –

+0

請提供預期的輸出以便問題更清晰。 – Sangharsh

回答

2

__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之一效率會非常低)

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} 
相關問題