How to make a list of integers that is the sum of all the integers from a set of lists in a dict?

Viewed 190

Let's assume I have a created a dict that is made up of n keys. Each key is mapped to a list of integers of a consistent length. What I want to make now is a new list that represents the sum of the integers at each point in lists of the dict. To illustrate:

my_dict = {'a': [1, 2, 3, 4], 'b': [2, 3, 4, 5], 'c': [3, 4, 5, 6]}

total_sum_list = []

for key in my_dict.keys():
    total_sum_list += ###some way of adding the numbers together

Expected output:

total_sum_list = [6,9,12,15]

As demonstrated above, I am not sure how to set up this for loop so that I can create a list like total_sum_list. I have tried putting together a list comprehension, but my efforts have not been successful thus far. Any suggestions?

2 Answers

What you need is to transpose the lists so you can sum the columns. So use zip on the dictionary values (keys can be ignored) and sum in list comprehension:

in one line:

total_sum_list = [sum(x) for x in zip(*my_dict.values())]

result:

[6, 9, 12, 15]

How it works:

zip interleaves the values. I'm using argument unpacking to pass the dict values are arguments to zip (like zip(a,b,c)). So when you do:

for x in zip(*my_dict.values()):
    print(x)

you get (as tuple):

(1, 3, 2)
(2, 4, 3)
(3, 5, 4)
(4, 6, 5)

data are ready to be summed (even in different order, but we don't care since addition is commutative :))

Depending on your use-case you might want to consider using an adequate library for more general/complex functionality.

numpy: general scientific computing

import numpy as np

my_dict = {'a': [1, 2, 3, 4], 'b': [2, 3, 4, 5], 'c': [3, 4, 5, 6]}

arr = np.array(list(d.values()))
# [[1 2 3 4]
#  [2 3 4 5]
#  [3 4 5 6]]

arr.sum(axis=0)
# [ 6  9 12 15]

pandas: data-analysis toolkit

import pandas as pd

my_dict = {'a': [1, 2, 3, 4], 'b': [2, 3, 4, 5], 'c': [3, 4, 5, 6]}

df = pd.DataFrame(my_dict)
#    a  b  c
# 0  1  2  3
# 1  2  3  4
# 2  3  4  5
# 3  4  5  6

df.sum(axis=1)
# 0     6
# 1     9
# 2    12
# 3    15
Related