PYTHON:根据另一个lis中的索引对一个列表中的元素进行汇总

2024-06-16 09:59:23 发布

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

下面是我要用Python实现的目标:

  • 我有一个列表“a”,有未排序和重复的索引。在
  • 我有一个列表“B”和一些浮点值
  • 长度A=长度B
  • 我想列出“C”,以A的重复索引为基础,以升序的方式列出B的总和值。在

示例:

A=[0 , 1 , 0 , 3 , 2 , 1 , 2] (indicates unsorted and repeated indices)

B=[25 , 10 , 15 , 10 , 5 , 30 , 50] (values to be summed)

C=[25+15 , 10+30 , 5+50 , 15] (summed values in a sorted manner)

到目前为止,我知道如何使用:

C= zip(*sorted(zip(A, B)))

得到结果:

[(0, 0, 1, 1, 2, 2, 3), (15, 25, 10, 30, 5, 50, 10)]

但我不知道怎么计算总数。在

创建列表C的好方法是什么?在


Tags: 示例目标列表排序方式zip基础浮点
3条回答

如果顺序重要,可以使用groupby

In [1]: A=[0 , 1 , 0 , 3 , 2 , 1 , 2]

In [2]: B=[25 , 10 , 15 , 10 , 5 , 30 , 50]

In [3]: from itertools import groupby

In [4]: from operator import itemgetter

In [5]: C = [sum(map(itemgetter(1), group))
   ...:      for key, group in groupby(sorted(zip(A, B)),
   ...:                                key=itemgetter(0))]

In [6]: C
Out[6]: [40, 40, 55, 10]

或者^{},如果没有:

^{pr2}$

请注意,python中的dict是无序的(您不能相信任何CPython实现细节)。在

zip()dict结合使用:

A = [0 , 1 , 0 , 3 , 2 , 1 , 2] 
B = [25 , 10 , 15 , 10 , 5 , 30 , 50]

sums = {}
for key, value in zip(A,B):
    try:
        sums[key] += value
    except KeyError:
        sums[key] = value
print(sums)
# {0: 40, 1: 40, 2: 55, 3: 10}

请参见a demo on ideone.com。在

实际上,您想要什么实际上有点不清楚,但是如果您希望将它们按任何数字编入索引,您甚至不应该使用列表,而是使用计数器:

>>> from collections import Counter
>>> c = Counter()
>>> A = [0, 1, 0, 3, 2, 1, 2]
>>> B = [25, 10, 15, 10 , 5, 30, 50]
>>> for k, v in zip(A, B):
...     c[k] += v
...
>>> c
Counter({2: 55, 0: 40, 1: 40, 3: 10})
>>> c[0]
40

如果你真的想要一个列表,你可以使用

^{pr2}$

但是,任何缺少的键都会导致其余的值显示在上面,这可能是也可能不是您想要的。在

相关问题 更多 >