aryswisnu
aryswisnu

Reputation: 91

Sum array values with specified index in Python

I have arrays like this:

['[camera_positive,3]', '[lens_positive,1]', '[camera_positive,2]', '[lens_positive,1]', '[lens_positive,1]', '[camera_positive,1]']

How to sum all value on index [1] with same string on index [0]?
Example:

camera_positive = 3 + 2 + 1 = 6
lens_positive = 1 + 1 + 1 = 3

Upvotes: 2

Views: 2337

Answers (3)

Jonas Adler
Jonas Adler

Reputation: 10799

You could use set in order to extract the unique keys and then use list comprehension to compute the sum for each key:

data = [['camera_positive', 3], 
        ['lens_positive', 1], 
        ['camera_positive', 2], 
        ['lens_positive', 1], 
        ['lens_positive', 1], 
        ['camera_positive', 1]]

keys = set(key for key, value in data)

for key1 in keys:
    total = sum(value for key2, value in data if key1 == key2)
    print("key='{}', sum={}".format(key1, total))

this gives:

key='camera_positive', sum=6
key='lens_positive', sum=3

Upvotes: 1

Johannes
Johannes

Reputation: 3388

You could group the entries by their first index using groupby with lambda x: x[0] or operator.itemgetter(0) as key.

This is maybe a bit less code than what Nick Brady showed. However you would need to sort the list first (for the same key), so it might be slower than his approach.

Upvotes: 0

Nick Brady
Nick Brady

Reputation: 6592

I'm assuming that you have a list of list, not a list of strings as shown in the question. Otherwise you'll have to do some parsing. That said, I would solve this problem by creating a dictionary, and then iterating over the values and adding them to the dictionary as you go.

The default dict allows this program to work without getting a key error, as it'll assume 0 if the key does not exist yet. You can read up on defaultdict here: https://docs.python.org/3.3/library/collections.html#collections.defaultdict

lmk if that helps!

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> d
defaultdict(<class 'int'>, {})
>>> lst=[['a',1], ['b', 2], ['a',4]]
>>> for k, v in lst:
...   d[k] += v
... 
>>> d
defaultdict(<class 'int'>, {'a': 5, 'b': 2})

Upvotes: 0

Related Questions