2015-11-09 98 views
0

我有一個大的嵌套列表,並在每個嵌套列表中有兩個值,一個公司名稱和金額,我想知道是否有一種方法來組合有嵌套列表同名,然後添加值?因此,例如這裏是清單的一部分結合像列表嵌套列表

[['Acer', 481242.74], ['Beko', 966071.86], ['Cemex', 187242.16], ['Datsun', 748502.91], ['Equifax', 146517.59], ['Gerdau', 898579.89], ['Haribo', 265333.85], ['Gerdau', 13019.63676], ['Gerdau', 34107.12062], ['Acer', 52153.02848] 

我希望看起來像下面這樣的結果

[['Acer',(481242.74+52153.02848)],['Beko', 966071.86],['Cemex', 187242.16],['Datsun', 748502.91],['Equifax', 146517.59],['Gerdau',(898579.89+13019.63676+34107.12062)],['Haribo', 265333.85]] 

所以基本上我試着寫代碼,會經過一個嵌套列表並返回通過查找所有的列表具有相同[0]元素,並結合有[1]元素做了一個列表

+0

「所以基本上我試着寫代碼」 ......然後顯示您什麼請嘗試。 – Julien

回答

4
from collections import defaultdict 
d = defaultdict(float) 
for name, amt in a: 
    d[name] += amt 

這裏做的事情是創建一個字典,其中量將爲零(float()),然後使用名稱作爲鍵進行總結。

如果你真的需要得到的結果是一個列表,你可以這樣說:

>>> print d.items() 
[('Equifax', 146517.59), ('Haribo', 265333.85), ('Gerdau', 945706.64738), ('Cemex', 187242.16), ('Datsun', 748502.91), ('Beko', 966071.86), ('Acer', 533395.76848)] 
+0

我該如何將它應用於我的代碼? –

+0

你可以從字面上複製粘貼它。 –

0
from collections import defaultdict 
d = defaultdict(list) 
l=[['Acer', 481242.74], ['Beko', 966071.86], ['Cemex', 187242.16], ['Datsun', 748502.91], ['Equifax', 146517.59], ['Gerdau', 898579.89], ['Haribo', 265333.85], ['Gerdau', 13019.63676], ['Gerdau', 34107.12062], ['Acer', 52153.02848]] 
for k,v in l: 
    d[k].append(v) 
w=[] 
for x,y in d.items(): 
    w.append([x,sum(y)]) 
print w 

Prints-

[['Equifax', 146517.59], ['Haribo', 265333.85], ['Gerdau', 945706.64738], ['Cemex', 187242.16], ['Datsun', 748502.91], ['Beko', 966071.86], ['Acer', 533395.76848]] 

如果想使它成爲一個元組

map(tuple,w) 

輸出是-

[('Equifax', 146517.59), ('Haribo', 265333.85), ('Gerdau', 945706.64738), ('Cemex', 187242.16), ('Datsun', 748502.91), ('Beko', 966071.86), ('Acer', 533395.76848)] 
+0

這不會在數學上「添加」數值,而是將它們添加到列表中。我認爲使用'+'代替','的OP意味着他/她想要數學。 –

0

defaultdict可能是一個很好的路要走,但你可以做到這一點與普通詞典:

>>> data = [['Acer', 481242.74], ['Beko', 966071.86], ['Cemex', 187242.16], ...] 
>>> result = {} 
>>> for k, v in data: 
...  result[k] = result.get(k, 0) + v 
>>> result 
{'Acer': 533395.76848, 'Beko': 966071.86, 'Cemex': 187242.16, ... } 
>>> list(result.items()) 
[('Acer', 533395.76848), ('Beko', 966071.86), ('Cemex', 187242.16), ...]