对条件为 python 的嵌套列表求和

Sum a Nested List with condition in python

为了简化所有其他用户的信息阅读,我想减少名称重复出现的嵌套列表。 具体例子:

[['savoielibrercgcm', '0.25'], ['MeriFer', '0.25'], ['XlassII', '0.25'], ['Tomixt_31', '0.25'], ['Tomixt_31', '0.25'], ['Tomixt_31', '0.25']]

(值并不总是等于0.25)

理想情况下可以根据昵称添加内容得到这样的列表:

[['savoielibrercgcm', '0.25'], ['MeriFer', '0.25'], ['XlassII', '0.25'], ['Tomixt_31', '0.75']]

我可以使用 for 循环和 if 条件轻松完成。但是程序很重并且必须管理大量数据,我希望能够“优化”这段代码。 我试图通过转换为 dict 但这删除了重复的键。

你有什么想法吗?地图的?我必须承认我从未接触过 map() :/

在此先感谢您的帮助^^'

这是一个使用 collections.Counter 的解决方案:

from collections import Counter

c = Counter()
for name, value in inputs:
    c[name] += float(value)

然后您可以再次将名称的累加值转换为字符串。计数器的工作方式与 built-in dict 相同。我不确定您的任务是否可以以更高效的方式完成。

使用字典对名称进行分组应该适用于此:

L = [['savoielibrercgcm', 0.25], ['MeriFer', 0.25], ['XlassII', 0.25],
     ['Tomixt_31', 0.25], ['Tomixt_31', 0.25], ['Tomixt_31', 0.25]]

grouped = dict()
grouped.update((name,grouped.get(name,0)+value) for name,value in L)
L = [*map(list,grouped.items())]

print(L)
[['savoielibrercgcm', 0.25], ['MeriFer', 0.25], ['XlassII', 0.25], 
 ['Tomixt_31', 0.75]] 

注意:我假设您真的不希望将数值存储为字符串

你可以使用像这样的中间字典来做到这一点:

from collections import defaultdict

mydict = defaultdict(int)
mylist = [['savoielibrercgcm', '0.25'], ['MeriFer', '0.25'], ['XlassII', '0.25'], ['Tomixt_31', '0.25'], ['Tomixt_31', '0.25'], ['Tomixt_31', '0.25']]
for name, value in mylist:
    mydict[name] += float(value)
newlist = [[k, f'{v:.2f}'] for k, v in mydict.items()]
print(newlist)

输出:

[['savoielibrercgcm', '0.25'], ['MeriFer', '0.25'], ['XlassII', '0.25'], ['Tomixt_31', '0.75']]