![](/img/trans.png)
[英]python remove elements from one list based on indices from another list
[英]Summing up elements from one list based on indices in another list
所以这就是我试图在 Python 中实现的目标:
例子:
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 的好方法是什么?
将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}
并在 ideone.com 上查看演示。
如果订单很重要,您可以使用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]
或defaultdict(float)
,如果没有:
In [10]: from collections import defaultdict
In [11]: res = defaultdict(float)
In [12]: for k, v in zip(A, B):
...: res[k] += v
...:
In [13]: res
Out[13]: defaultdict(float, {0: 40.0, 1: 40.0, 2: 55.0, 3: 10.0})
请注意,python 中的dict
是无序的(您不要相信任何 CPython 实现细节)。
实际上有点不清楚你想要什么,但是如果你希望它们被任何数字索引,你甚至不应该使用列表,而是使用计数器:
>>> 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
如果你真的想要一个列表,你可以使用
>>> [i[1] for i in sorted(c.items())]
但是任何丢失的键都会导致其余的值显示在上面,这可能是也可能不是你想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.