对条件为 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']]
为了简化所有其他用户的信息阅读,我想减少名称重复出现的嵌套列表。 具体例子:
[['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']]