这似乎非常适合itertools.groupby https://docs.python.org/library/itertools.html#itertools.groupby(假设值在A
are sorted,它可能无法正常工作A=[1,1,2,2,1]
):
from itertools import groupby
A = [1, 1, 2, 3, 3, 3]
B = [0.50, 0.25, 0.99, 0.80, 0.70, 0.20]
for key, grp in groupby(zip(A, B), key=lambda x: x[0]):
grp = [i[1] for i in grp]
print(key, key * sum(grp))
打印:
1 0.75
2 1.98
3 5.1
您还可以将其存储在列表中而不是打印值:
res = []
for key, grp in groupby(zip(A, B), key=lambda x: x[0]):
grp = [i[1] for i in grp]
res.append(key*sum(grp))
print(res)
# [0.75, 1.98, 5.1]
如果您可以选择第 3 方软件包,您也可以使用iteration_utilities.groupedby https://iteration-utilities.readthedocs.io/en/latest/generated/groupedby.html:
>>> from iteration_utilities import groupedby
>>> from operator import itemgetter, add
>>> {key: key*sum(value) for key, value in groupedby(zip(A, B), key=itemgetter(0), keep=itemgetter(1)).items()}
{1: 0.75, 2: 1.98, 3: 5.1}
或使用reduce
的参数groupedby
直接地:
>>> groupedby(zip(A, B), key=itemgetter(0), keep=lambda x: x[0]*x[1], reduce=add)
{1: 0.75, 2: 1.98, 3: 5.1}
免责声明:我是该书的作者iteration_utilities https://iteration-utilities.readthedocs.io/en/latest/index.html包裹。