Python Basics — Nested Dictionaries
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 ortry/except - Iterate with nested
forloops over.items() defaultdict(list)simplifies dynamic nesting- Nested dicts map directly to/from JSON
Next up: Dictionaries — Practice Exercises →