Python Basics — Nested Dictionaries

2 minute read

Nested Dictionaries

Dictionaries can contain other dictionaries as values, creating hierarchical data structures — similar to JSON.

Creating Nested Structures

company = {
    "engineering": {
        "lead": "Alice",
        "members": ["Bob", "Charlie"],
        "budget": 500000
    },
    "marketing": {
        "lead": "Diana",
        "members": ["Eve"],
        "budget": 200000
    }
}

Accessing Deeply Nested Values

Chain bracket notation:

print(company["engineering"]["lead"])       # Alice
print(company["engineering"]["members"][0]) # Bob
print(company["marketing"]["budget"])       # 200000

Safe Access Patterns

.get() Chaining

# If any key is missing, returns None instead of KeyError
lead = company.get("engineering", {}).get("lead", "Unknown")
print(lead)  # Alice

# Missing department
lead = company.get("sales", {}).get("lead", "Unknown")
print(lead)  # Unknown

try/except

try:
    value = company["sales"]["lead"]
except KeyError:
    value = "Unknown"
print(value)  # Unknown

Modifying Nested Values

company = {
    "engineering": {"lead": "Alice", "members": ["Bob"]}
}

# Update a nested value
company["engineering"]["lead"] = "Frank"

# Add to nested list
company["engineering"]["members"].append("Grace")

# Add a new nested dictionary
company["design"] = {"lead": "Heidi", "members": []}

print(company)
# {'engineering': {'lead': 'Frank', 'members': ['Bob', 'Grace']},
#  'design': {'lead': 'Heidi', 'members': []}}

Iterating Over Nested Dicts

students = {
    "Alice": {"math": 95, "english": 88},
    "Bob": {"math": 78, "english": 92},
    "Charlie": {"math": 85, "english": 80},
}

for name, grades in students.items():
    avg = sum(grades.values()) / len(grades)
    print(f"{name}: average = {avg:.1f}")
# Alice: average = 91.5
# Bob: average = 85.0
# Charlie: average = 82.5

Flattening Nested Dicts

def flatten_dict(d, parent_key="", sep="."):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            items.extend(flatten_dict(v, new_key, sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

nested = {
    "user": {
        "name": "Alice",
        "address": {
            "city": "New York",
            "zip": "10001"
        }
    }
}

flat = flatten_dict(nested)
print(flat)
# {'user.name': 'Alice', 'user.address.city': 'New York', 'user.address.zip': '10001'}

JSON-like Data Structures

Nested dicts map directly to JSON — Python’s json module handles the conversion:

import json

api_response = {
    "status": "success",
    "data": {
        "users": [
            {"id": 1, "name": "Alice", "active": True},
            {"id": 2, "name": "Bob", "active": False}
        ],
        "total": 2
    }
}

# Pretty-print
print(json.dumps(api_response, indent=2))

# Access nested data
for user in api_response["data"]["users"]:
    status = "active" if user["active"] else "inactive"
    print(f"{user['name']} ({status})")
# Alice (active)
# Bob (inactive)

Building Nested Dicts Dynamically

Using setdefault()

data = [
    ("fruits", "apple"),
    ("fruits", "banana"),
    ("vegetables", "carrot"),
    ("fruits", "cherry"),
    ("vegetables", "pea"),
]

grouped = {}
for category, item in data:
    grouped.setdefault(category, []).append(item)

print(grouped)
# {'fruits': ['apple', 'banana', 'cherry'], 'vegetables': ['carrot', 'pea']}

Using collections.defaultdict

from collections import defaultdict

# Auto-creates missing keys with default value
grouped = defaultdict(list)
for category, item in data:
    grouped[category].append(item)

print(dict(grouped))
# {'fruits': ['apple', 'banana', 'cherry'], 'vegetables': ['carrot', 'pea']}

Summary

  • Nest dicts for hierarchical data: d = {"a": {"b": 1}}
  • Access with chained brackets: d["a"]["b"]
  • Safe access with .get() chaining or try/except
  • Iterate with nested for loops over .items()
  • defaultdict(list) simplifies dynamic nesting
  • Nested dicts map directly to/from JSON

Next up: Dictionaries — Practice Exercises →

Updated: