2016-09-20 254 views
0

所以在这里总结的元素是什么,我想在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的好方法?

+2

你可以添加你到目前为止尝试过的代码吗? –

+0

对不起,我编辑过这条消息 – user3641829

回答

2

使用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

0

你可以使用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}) 

注意dict S IN蟒蛇是无序的,(你是不信任任何CPython实现细节)。

0

它实际上是一个有点不清楚你想要什么,但如果你希望他们能以任何数量为索引,你甚至不应该使用一个列表,但一个计数器来代替:

>>> 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())] 

但这时缺少键会导致其余的值显示上,这可能是也可能不是你想要的。