How to Loop Through a Dictionary in Python

If you want to go through the contents of a dictionary in Python, there are three main patterns to know:

  • loop through keys
  • loop through values
  • loop through keys and values together

This page shows the most useful ways to do that with simple examples.

Quick answer

student = {"name": "Ana", "age": 20, "city": "Lima"}

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

Output:

name Ana
age 20
city Lima

Use .items() when you need both the key and the value during the loop.

What this page helps you do

  • Loop through dictionary keys
  • Loop through dictionary values
  • Loop through both keys and values
  • Choose the right method for your task

Start with a simple dictionary

A dictionary stores data as key-value pairs.

In this example:

  • "name" is a key
  • "Ana" is its value
student = {
    "name": "Ana",
    "age": 20,
    "city": "Lima"
}

Expected printed output for this dictionary might look like this, depending on how you loop:

name
age
city

or:

Ana
20
Lima

or:

name Ana
age 20
city Lima

If dictionaries are new to you, see Python dictionaries explained.

Loop through dictionary keys

A basic for loop over a dictionary gives you the keys by default.

student = {
    "name": "Ana",
    "age": 20,
    "city": "Lima"
}

for key in student:
    print(key)

Output:

name
age
city

Use this when you only need the keys.

You can also write the same thing with .keys():

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

This works too, but it is often not necessary. A plain loop over the dictionary is shorter and does the same job.

If you want to work directly with dictionary keys, see the dict.keys() method.

Loop through dictionary values

Use .values() when you want only the values.

student = {
    "name": "Ana",
    "age": 20,
    "city": "Lima"
}

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

Output:

Ana
20
Lima

This is useful when the keys do not matter.

For more detail, see the dict.values() method.

Loop through keys and values together

Use .items() when you need both parts of each dictionary entry.

student = {
    "name": "Ana",
    "age": 20,
    "city": "Lima"
}

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

Output:

name Ana
age 20
city Lima

This is the most common pattern for printing or processing dictionary contents.

You can format the output more clearly if you want:

for key, value in student.items():
    print(f"{key}: {value}")

Output:

name: Ana
age: 20
city: Lima

If you want a method-focused explanation, see the dict.items() method.

When to use each approach

Use the loop style that matches your task:

  • Use for key in data: when you need keys only
  • Use for value in data.values(): when you need values only
  • Use for key, value in data.items(): when you need both

Examples:

student = {
    "name": "Ana",
    "age": 20,
    "city": "Lima"
}

# Keys only
for key in student:
    print("Key:", key)

# Values only
for value in student.values():
    print("Value:", value)

# Keys and values
for key, value in student.items():
    print(key, "->", value)

Common beginner mistakes

1. Trying to unpack a plain dictionary loop into key and value

This is wrong:

student = {"name": "Ana", "age": 20}

for key, value in student:
    print(key, value)

A plain dictionary loop returns only keys, not key-value pairs.

Use .items() instead:

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

2. Forgetting parentheses in .items() or .values()

These are methods, so you must call them with parentheses.

Wrong:

for value in student.values:
    print(value)

Correct:

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

3. Changing dictionary size during the loop

Be careful about adding or removing keys while looping.

Problem example:

student = {"name": "Ana", "age": 20, "city": "Lima"}

for key in student:
    if key == "age":
        del student[key]

This can raise an error because the dictionary size changes during iteration.

A safer approach is to loop over a copy of the keys:

student = {"name": "Ana", "age": 20, "city": "Lima"}

for key in list(student.keys()):
    if key == "age":
        del student[key]

print(student)

Output:

{'name': 'Ana', 'city': 'Lima'}

Simple variations

Use enumerate(data.items()) if you also need a counter

If you want the position number as well as the key and value, use enumerate().

student = {"name": "Ana", "age": 20, "city": "Lima"}

for index, (key, value) in enumerate(student.items(), start=1):
    print(index, key, value)

Output:

1 name Ana
2 age 20
3 city Lima

If this pattern is new to you, see how to use enumerate() in Python.

Use an if statement inside the loop to filter results

You can check conditions inside the loop.

student = {"name": "Ana", "age": 20, "city": "Lima"}

for key, value in student.items():
    if key != "city":
        print(key, value)

Output:

name Ana
age 20

Loop through nested dictionaries one level at a time

If a value is another dictionary, loop through it separately.

student = {
    "name": "Ana",
    "grades": {
        "math": 90,
        "science": 85
    }
}

for key, value in student.items():
    print("Outer:", key, value)

    if isinstance(value, dict):
        for inner_key, inner_value in value.items():
            print("  Inner:", inner_key, inner_value)

Output:

Outer: name Ana
Outer: grades {'math': 90, 'science': 85}
  Inner: math 90
  Inner: science 85

Debugging dictionary loop problems

If your loop is not working as expected, these quick checks can help:

print(data)
print(type(data))
print(data.keys())
print(data.values())
print(data.items())

These checks help you confirm:

  • that data is really a dictionary
  • what keys it contains
  • what values it contains
  • what key-value pairs Python sees

Common causes of problems include:

  • using for key, value in data instead of data.items()
  • calling items or values without parentheses
  • removing or adding keys during iteration
  • confusing dictionary loops with list loops

FAQ

How do I loop through both key and value in a dictionary?

Use:

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

Does looping through a dictionary return keys or values?

By default, looping through a dictionary returns keys.

for key in my_dict:
    print(key)

How do I get only dictionary values in a loop?

Use:

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

Can I change a dictionary while looping through it?

It is safer not to change its size during the loop. If needed, loop through a copy of the keys first.

for key in list(my_dict.keys()):
    # safe place to delete keys if needed
    pass

See also