Python | Sum list of dictionaries with same key
You have given a list of dictionaries, the task is to return a single dictionary with sum values with the same key. Let’s discuss different methods to do the task.
Method #1: Using reduce() + operator
Python3
# Python code to demonstrate # return the sum of values of dictionary # with same keys in list of dictionary import collections, functools, operator # Initialising list of dictionary ini_dict = [{ 'a' : 5 , 'b' : 10 , 'c' : 90 }, { 'a' : 45 , 'b' : 78 }, { 'a' : 90 , 'c' : 10 }] # printing initial dictionary print ("initial dictionary", str (ini_dict)) # sum the values with same keys result = dict (functools. reduce (operator.add, map (collections.Counter, ini_dict))) print ("resultant dictionary : ", str (result)) |
initial dictionary [{‘b’: 10, ‘a’: 5, ‘c’: 90}, {‘b’: 78, ‘a’: 45}, {‘a’: 90, ‘c’: 10}] resultant dictionary : {‘b’: 88, ‘a’: 140, ‘c’: 100}
Method #2: Using counter
Python3
# Python code to demonstrate # return the sum of values of dictionary # with same keys in list of dictionary import collections # Initialising list of dictionary ini_dict = [{ 'a' : 5 , 'b' : 10 , 'c' : 90 }, { 'a' : 45 , 'b' : 78 }, { 'a' : 90 , 'c' : 10 }] # printing initial dictionary print ("initial dictionary", str (ini_dict)) # sum the values with same keys counter = collections.Counter() for d in ini_dict: counter.update(d) result = dict (counter) print ("resultant dictionary : ", str (counter)) |
initial dictionary [{‘c’: 90, ‘a’: 5, ‘b’: 10}, {‘a’: 45, ‘b’: 78}, {‘a’: 90, ‘c’: 10}] resultant dictionary : Counter({‘a’: 140, ‘c’: 100, ‘b’: 88})
Method #3: Naive Method
Python3
# Python code to demonstrate # return the sum of values of dictionary # with same keys in list of dictionary from operator import itemgetter # Initialising list of dictionary ini_dict = [{ 'a' : 5 , 'b' : 10 , 'c' : 90 }, { 'a' : 45 , 'b' : 78 }, { 'a' : 90 , 'c' : 10 }] # printing initial dictionary print ("initial dictionary", str (ini_dict)) # sum the values with same keys result = {} for d in ini_dict: for k in d.keys(): result[k] = result.get(k, 0 ) + d[k] print ("resultant dictionary : ", str (result)) |
initial dictionary [{‘b’: 10, ‘c’: 90, ‘a’: 5}, {‘b’: 78, ‘a’: 45}, {‘c’: 10, ‘a’: 90}] resultant dictionary : {‘b’: 88, ‘c’: 100, ‘a’: 140}
Method: Using a dictionary comprehension
Another approach to sum the values of dictionaries with the same key in a list of dictionaries is to use a dictionary comprehension. This method is concise and can be easier to read than the other methods, depending on your personal preferences. Here’s an example of how you can use a dictionary comprehension to achieve the same result as the other methods:
Python3
ini_dict = [{ 'a' : 5 , 'b' : 10 , 'c' : 90 }, { 'a' : 45 , 'b' : 78 }, { 'a' : 90 , 'c' : 10 }] # Create a dictionary with keys and values obtained by iterating over the keys in the dictionaries # and summing the values for each key. result = {k: sum (d[k] for d in ini_dict if k in d) for k in set (k for d in ini_dict for k in d)} print (result) # Output: {'b': 88, 'a': 140, 'c': 100} #This code is contributed by Edula Vinay Kumar Reddy |
{'a': 140, 'c': 100, 'b': 88}
The time complexity of this approach is O(n * m), where n is the number of dictionaries in the list and m is the average number of keys in each dictionary. This is because the dictionary comprehension iterates over all the keys in all the dictionaries and sums the values for each key.
The space complexity is also O(n * m), because the resulting dictionary will have at most n * m key-value pairs.
Please Login to comment...