Skip to content

A Comprehensive Guide to Iterating Through Dictionaries in Python

Updated: at 03:23 AM

Dictionaries are a fundamental data structure in Python used to store data as key-value pairs. Compared to sequences like lists and tuples which store data based on an index, dictionaries allow efficient access to values when the key is known.

Being able to iterate through the contents of a dictionary is a common task in Python programming. There are several different ways to iterate through a dictionary, each with their own use cases and advantages. This comprehensive guide will provide Python developers with a deep understanding of the various techniques for iterating through dictionaries using keys, values, and items.

We will cover the following topics in-depth with example code snippets:

Table of Contents

Open Table of Contents

Overview of Python Dictionaries

A dictionary in Python contains unordered mappings of unique keys to values. Dictionaries are declared using curly braces {} or the dict() constructor. Elements are accessed via keys using square brackets [] instead of numeric indexes.

# Create empty dictionary
my_dict = {}

# Create dictionary with initial values
my_dict = {'key1': 'value1', 'key2': 'value2'}

Dictionaries are highly optimized for retrieving values when the key is known, using a technique called hashing under the hood. Some key properties of Python dictionaries:

Now that we have a basic understanding of Python dictionaries, let’s explore different ways to iterate through them.

Basic Ways to Iterate Through a Dictionary

There are a couple straightforward ways to loop through a dictionary in Python by using a for loop on the dictionary directly.

Iterating through Keys

You can iterate through all the keys in a dictionary using:

my_dict = {'a': 1, 'b': 2, 'c': 3}

for key in my_dict:
    print(key)

# Output:
# a
# b
# c

This loop iterates through each key in the dictionary and prints it out.

Iterating through Keys and Values

To access both the key and value in each iteration, you can use .items() method on the dictionary inside the for loop:

for key, value in my_dict.items():
    print(key, value)

# Output:
# a 1
# b 2
# c 3

This allows you to access both the key and value in each iteration, very useful in most cases.

While these basic approaches are handy for small dictionaries, they are not very efficient or flexible for large datasets. Let’s go over some more advanced dictionary iteration techniques.

Using dict.keys() to Iterate Over Keys

The .keys() dictionary method returns a dict_keys object that contains all the keys in the dictionary. This object can be iterated over directly in a loop to access just the keys:

my_dict = {'a': 1, 'b': 2, 'c': 3}

for key in my_dict.keys():
    print(key)

# Output:
# a
# b
# c

Some advantages of using .keys():

You can convert dict_keys to a list if needed for full functionality:

keys_list = list(my_dict.keys())

In summary, dict.keys() provides an efficient and safe way to iterate through just the keys of a dictionary.

Using dict.values() to Iterate Over Values

Similar to .keys(), the .values() method returns a dict_values object containing all the values in the dictionary:

my_dict = {'a': 1, 'b': 2, 'c': 3}

for value in my_dict.values():
  print(value)

# Output:
# 1
# 2
# 3

The dict_values object has similar properties as dict_keys like memory efficiency and consistent iteration order.

Some use cases for iterating through just values:

Conversion to a standard list is possible if required:

values_list = list(my_dict.values())

In summary, dict.values() offers a way to directly iterate through just the values in a compact and efficient manner.

Using dict.items() to Iterate Over Key-Value Pairs

The most flexible way to iterate through a dictionary in Python is using the .items() method. It returns a dict_items object that is an iterable view over the key-value pairs in the dictionary.

Here is an example usage:

my_dict = {'a': 1, 'b': 2, 'c': 3}

for key, value in my_dict.items():
    print(key, value)

# Output:
# a 1
# b 2
# c 3

We get access to both the key and value during each iteration as a tuple pair. This is useful for most dictionary processing tasks.

Some key advantages of using .items():

Conversion to list of tuples is possible when required:

items_list = list(my_dict.items())
# [(a, 1), (b, 2), (c, 3)]

In summary, dict.items() is the most versatile way to iterate through the entire contents of a dictionary by accessing key-value pairs.

Iterating Through Sorted Keys and Sorted Items

Since dictionaries are inherently unordered in Python, iterating through keys, values or items does not guarantee any sorted order.

To iterate through a dictionary in sorted order of keys or items, we need to explicitly sort them first using the sorted() function.

Sorted Keys

To iterate through keys of a dictionary in sorted order:

my_dict = {'banana': 1, 'apple': 2, 'mango': 3}

for key in sorted(my_dict.keys()):
    print(key)

# Output:
# apple
# banana
# mango

We first get a list of keys using .keys() and then apply sorted() on it before iterating.

Sorted Items

Similarly, we can iterate through keyed-value pairs sorted by keys like this:

for key, value in sorted(my_dict.items()):
   print(key, value)

# Output:
# apple 2
# banana 1
# mango 3

This technique works even if the values are unsortable objects.

Sorting by values instead of keys is also possible by using key argument:

for key, value in sorted(my_dict.items(), key=lambda x: x[1]):
   print(key, value)

In summary, calling sorted() on dict.keys() or dict.items() allows iterating through dictionaries in a sorted manner.

Using enumerate() to Track Index While Iterating

When iterating through a dictionary, you may also want to keep track of the index along with the keys and values.

Python’s built-in enumerate() function allows you to do this:

my_dict = {'a': 1, 'b': 2, 'c': 3}

for index, (key, value) in enumerate(my_dict.items()):
    print(index, key, value)

# Output:
# 0 a 1
# 1 b 2
# 2 c 3

We pass the .items() as input to enumerate() which assigns an index to each item in the dictionary. This index can be used to track position or for other purposes while iterating.

Some use cases:

In summary, enumerate() offers a way to access the iteration index when looping through dictionaries in Python.

Iterating Safely When Modifying Dictionary

Modifying a dictionary by adding or removing keys while iterating through it can cause errors or unexpected behavior.

Python detects such changes to dict size during iteration and raises a RuntimeError exception:

my_dict = {'a': 1, 'b': 2, 'c': 3}

for key in my_dict:
    if key == 'b':
        del my_dict[key] # Deletes 'b'

# Raises RuntimeError

To avoid such issues, we need to iterate through a copy of keys/values/items instead:

for key in my_dict.copy().keys():
    if key == 'b':
        del my_dict[key] # OK

for key, value in my_dict.copy().items():
    if value == 2:
        del my_dict[key] # OK

Making a full slice copy ensures modifications to original dict do not cause any exceptions during iteration.

In summary, create copies of dict views instead of iterating directly when deleting or adding keys inside the loop.

Iterating Through Nested Dictionaries

In Python, values of a dictionary can themselves be dictionaries leading to nested dictionaries.

For example:

nested_dict = {
  'dictA': {'key1': 1, 'key2': 2},
  'dictB': {'key3': 3, 'key4': 4}
}

To iterate through all keys and values in such nested dictionaries, we need to write loops inside loops:

for key, value in nested_dict.items():
    print(f"Outer Key: {key}")

    for inner_key, inner_value in value.items():
        print(f"Inner Key: {inner_key}, Value: {inner_value}")

This outputs:

Outer Key: dictA
Inner Key: key1, Value: 1
Inner Key: key2, Value: 2
Outer Key: dictB
Inner Key: key3, Value: 3
Inner Key: key4, Value: 4

We can also retrieve inner values directly using chained square bracket lookups:

nested_dict['dictA']['key1'] # Returns 1

So iterating through nested dictionaries requires looping over the outer keys and inner keys separately.

Use Cases and Best Practices

Let’s go over some best practices for iterating through dictionaries:

Some common use cases where dictionary iteration is used:

In summary, the various techniques covered in this guide will allow you to flexibly iterate through Python dictionaries for a wide range of applications. Mastering dictionary iteration is key to unlocking the full power and convenience of this fundamental Python data structure.

Conclusion

This guide covered a wide range of methods and techniques for iterating through dictionaries in Python:

Dictionaries are a versatile data structure. Being able to efficiently loop through dictionary keys, values or key-value pairs is an essential skill for Python programmers.

I hope this guide provided you with a firm understanding of the various nuances involved. The examples demonstrate how to apply these techniques for common use cases.

You should now feel confident in using the appropriate dictionary iteration method for a given programming problem in Python. Mastering these will help you write cleaner and more efficient Python code.

Happy coding!