2016-09-18 46 views
0

我有一個列表的列表,我想合併它們來求和index[0]值匹配的內部index[1]值。我的名單看起來是這樣的:索引0值匹配的總和列表值?

lists = [ 
['Gifts', [4]], 
['Gifts', [4]], 
['Politics', [3]], 
['Supply', [4]], 
['Supply', [4]], 
['Prints', [1]], 
['Prints', [1]], 
['Prints', [1]], 
['Politics', [3]], 
['Politics', [3]], 
['Accounts', [2]], 
['Accounts', [2]], 
['Accounts', [2]], 
['Features', [3]], 
['Features', [2]] 
] 

因此,我要像新的結構是:

new_lists = [ 
['Gifts', 8], ['Politics', 9], ['Supply', 8], ['Prints', 3], ['Accounts', 6], ['Features', 5] 
] 

如何在Python實現這一目標?

+0

你確定你的嵌套是正確的嗎?它是'['Gifts',[4]]還是'['Gifts',4],' – Bharel

回答

3

您可以使用defaultdict(int)collections模塊:

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> for key, value in lists: 
...  d[key] += value[0] 
... 
>>> dict(d) 
{'Gifts': 8, 'Prints': 3, 'Accounts': 6, 'Features': 5, 'Supply': 8, 'Politics': 9} 
>>> list(d.items()) 
[('Prints', 3), ('Features', 5), ('Supply', 8), ('Gifts', 8), ('Accounts', 6), ('Politics', 9)] 
1

使用defaultdict

In [52]: from collections import defaultdict 

In [53]: d = defaultdict(int) 

In [54]: for name, (val,) in lists: 
    ....:  d[name] += val 
    ....:  

In [55]: d.items() 
Out[55]: dict_items([('Politics', 9), ('Supply', 8), ('Prints', 3), ('Features', 5), ('Gifts', 8), ('Accounts', 6)]) 
3

或者,使用Countercollections。您可以手動爲每個鍵遞增值初始化:

from collections import Counter 

c = Counter() 
for i, j in lists: 
    c[i] += l[j] 

或者,通過提供的擴展內容的簡單列表,Counter會那麼做的計數爲您提供:

c = Counter(sum([[i] * j[0] for i,j in lists], [])) 

在這兩種情況下,通過使用列表中理解抓住計數器的內容與c.items()創建結果列表:

r = [[i, j] for i, j in c.items()] 

結果爲:

print(r) 
[['Supply', 8], ['Features', 5], ['Prints', 3], 
['Gifts', 8], ['Accounts', 6], ['Politics', 9]]