将类似列表与嵌套列表组合在一起

时间:2015-11-09 04:30:32

标签: python list nested-lists

我有一个大型嵌套列表,并且在每个嵌套列表中都有两个值,一个公司名称和一个金额,我想知道是否有办法将具有相同名称的嵌套列表组合在一起然后添加值?所以例如这里是列表的一部分

[['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]元素

3 个答案:

答案 0 :(得分:4)

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

这样做的目的是创建一个dict,默认情况下金额为零(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)]

答案 1 :(得分: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

打印 -

[['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)]

答案 2 :(得分: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), ...]