2016-09-20 258 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())] 

但這時缺少鍵會導致其餘的值顯示上,這可能是也可能不是你想要的。