Skip to content

How to Sum Dictionary Values in Python

Learn efficient methods to sum values in Python dictionaries, including summing all values in a single dict, specific keys across lists of dicts, and grouped totals using sum(), loops, and collections.Counter.

This guide explores various methods for summing numeric values stored within Python dictionaries. We'll cover summing all values in a single dictionary, summing values for specific keys across a list of dictionaries, and summing all numeric values across all keys in a list of dictionaries. Techniques include using the built-in sum(), for loops, functools.reduce, and collections.Counter.

Summing All Values in a Single Dictionary

To calculate the total sum of all numeric values within a single dictionary:

This is the most concise and Pythonic approach:

my_dict = {'one': 1, 'two': 2, 'three': 3}
total = sum(my_dict.values())
print(total)  # Output: 6
  • my_dict.values() returns a view object containing all the values from the dictionary.
  • sum() directly iterates over this view and calculates the sum.
  • This method correctly returns 0 for an empty dictionary.

Using a for Loop

A for loop provides a more explicit way to achieve the same result:

my_dict = {'one': 1, 'two': 2, 'three': 3}
total = 0
for value in my_dict.values():
    total += value
print(total) # Output: 6

Using functools.reduce()

While reduce() can be used, it's generally considered less readable than sum() for simple summation:

from functools import reduce

my_dict = {'one': 1, 'two': 2, 'three': 3}
total = reduce(lambda acc, current: acc + current, my_dict.values(), 0) # Start with 0
print(total)  # Output: 6
  • The reduce() function takes a function and applies it cumulatively to the items of an iterable.

Summing Values for a Specific Key in a List of Dictionaries

To sum the values associated with a specific key across all dictionaries in a list:

list_of_dicts = [
    {'name': 'Alice', 'salary': 100},
    {'name': 'Bob',   'salary': 150},
    {'name': 'Carl',  'salary': 120},
    {'name': 'Diana', 'score': 95}, # Dictionary might not have 'salary'
]

total_salary = sum(d.get('salary', 0) for d in list_of_dicts) # Use get() for safety
print(total_salary)  # Output: 370
  • The generator expression (d.get('salary', 0) for d in list_of_dicts) iterates through the list.
  • d.get('salary', 0) safely retrieves the value for the 'salary' key. If the key doesn't exist in a dictionary, it returns the default value 0, preventing KeyError and ensuring those dictionaries don't affect the sum.
  • sum() adds up the retrieved salary values.

Summing Values for All Keys in a List of Dictionaries

To sum values grouped by their respective keys across a list of dictionaries, use collections.Counter:

from collections import Counter

list_of_dicts = [
    {'id': 1, 'salary': 100, 'bonus': 10},
    {'id': 2, 'salary': 150},
    {'id': 3, 'salary': 120, 'bonus': 20},
]

totals_by_key = Counter()
for d in list_of_dicts:
    for key, value in d.items():
        if isinstance(value, (int, float)):
            totals_by_key[key] += value

print(totals_by_key)

grand_total = sum(totals_by_key.values())
print(grand_total) # Output: 406
  • Counter() is a dictionary subclass designed for counting hashable objects (or, in this case, accumulating sums).
  • The nested loops iterate through each dictionary and then each key-value pair.
  • isinstance(value, (int, float)) ensures we only try to sum numeric types.
  • totals_by_key[key] += value adds the value to the running total for that specific key in the Counter.

Conclusion

This guide explored various methods for summing values in Python dictionaries.

  • For summing all values in a single dictionary, sum(my_dict.values()) is the most direct approach.
  • When summing values for a specific key across a list of dictionaries, a generator expression with sum() and dict.get() is recommended for safety and conciseness.
  • For summing all numeric values grouped by key across a list of dictionaries, collections.Counter provides an effective solution.
Navigation