用嵌套列表合并like列表

2024-09-29 19:22:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

[['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]元素组合而成的


Tags: 名称元素列表公司金额例子办法本质
3条回答
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)]

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), ...]
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)]

相关问题 更多 >

    热门问题