具有附加值的多个列表的快速压缩

Rapid compression of multiple lists with value addition

我正在寻找一种 pythonic 方法来遍历大量列表,并使用一个列表中重复值的索引来计算另一个列表中具有相同索引的值的总值。

例如,假设我有两个列表

a = [ 1, 2, 3, 1, 2, 3, 1, 2, 3]
b = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]

我想做的是找到a中的唯一值,然后将具有相同索引的b中的相应值加在一起。我的尝试很慢,如下所示:

a1=list(set(a))
b1=[0 for y in range(len(a1))] 
    for m in range(len(a)):
        for k in range(len(a1)):
            if a1[k]==a[m]:
                b1[k]+=b[m]

然后我得到

a1=[1, 2, 3]
b1=[12, 15, 18]

请让我知道是否有更快、更 pythonic 的方法来执行此操作。 谢谢

使用 zip() function and a defaultdict dictionary 收集每个唯一值的值:

from collections import defaultdict
try:
    # Python 2 compatibility
    from future_builtins import zip
except ImportError:
    # Python 3, already there
    pass

values = defaultdict(int)
for key, value in zip(a, b):
    values[key] += value

a1, b1 = zip(*sorted(values.items()))

zip() 将两个输入列表中的值配对,现在您所要做的就是将 b 中的每个值与 a.[=21 的每个唯一值相加=]

最后一行从生成的字典中提取键和值,对它们进行排序,并将键和值分别放入 a1b1

演示:

>>> from collections import defaultdict
>>> a = [ 1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> b = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> values = defaultdict(int)
>>> for key, value in zip(a, b):
...     values[key] += value
...
>>> zip(*sorted(values.items()))
[(1, 2, 3), (12, 15, 18)]

如果您不关心输出顺序,可以完全放弃 sorted() 调用。