2016-09-20 11 views
0

So, hier ist das, was ich in Python zu erreichen versuchen:PYTHON: Fasst man Elemente aus einer Liste auf Indizes in einer anderen Liste

  • Ich habe eine Liste „A“ mit unsortiertem und wiederholten Indizes.
  • Ich habe eine Liste „B“ mit einem gewissen Fließkommawerten
  • Länge A = Länge B
  • Ich mag Liste „C“ mit summierten Werten von B auf der Grundlage des wiederholten Indizes in A in einem sortierten ansteigend.

Beispiel:

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)

Bisher weiß ich, wie das Sortieren von Bit zu tun mit:

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

Erste das Ergebnis:

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

Aber ich weiß nicht, wie die Summe zu tun.

Was wäre ein guter Weg, um Liste C zu erstellen?

+2

Könnten Sie den Code hinzufügen, den Sie bisher versucht haben? –

+0

Entschuldigung, ich habe die Nachricht einschließlich dieser bearbeitet – user3641829

Antwort

2

Verwendung zip() in Kombination mit einem 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} 

Und a demo on ideone.com sehen.

0

Sie könnten groupby verwenden, wenn die Reihenfolge wichtig:

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] 

oder defaultdict(float), wenn dies nicht der Fall:

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}) 

Beachten Sie, dass dict s in Python ungeordnet sind (Sie sind nicht vertrauen alle CPython-Implementierungsdetails).

0

Es ist eigentlich ein wenig unklar, was Sie wollen, aber wenn man sie indiziert durch was auch immer, die Zahl ist sein wollen, sollten Sie nicht einmal eine Liste verwenden, aber ein Zähler statt:

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

Wenn Sie wirklich eine Liste möchten, können Sie

>>> [i[1] for i in sorted(c.items())] 

verwenden, aber dann würde jeder fehlenden Schlüssel bewirken, dass die restlichen Werte oberen auftauchen, die möglicherweise oder möglicherweise nicht sein, dass das, was Sie wollten.

Verwandte Themen