A nested data structure is simply one data structure that contains another.
Examples:
A list of lists
A dictionary of lists
A list of dictionaries
A dictionary of dictionaries
📦 These allow you to organize and access multi-dimensional data effectively.
📚 Common Types of Nested Structures
🧮 List Inside a List
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[0]) # ➤ [1, 2, 3]
print(matrix[1][2]) # ➤ 6📌 Use Case: 2D grids, tables, game boards.
📋 List of Dictionaries
students = [
{"name": "Alice", "age": 22},
{"name": "Bob", "age": 23}
]
print(students[1]['name']) # ➤ Bob📌 Use Case: Tabular data like CSV rows, API data, records.
📜 Dictionary with List Values
courses = {
"Python": ["Basics", "OOP", "Web Dev"],
"Java": ["Core", "Spring", "Hibernate"]
}
print(courses['Python'][1]) # ➤ OO📌 Use Case: Grouping related topics or options under a category.
🧾 Dictionary of Dictionaries
employee = {
"emp1": {"name": "Alice", "dept": "HR"},
"emp2": {"name": "Bob", "dept": "IT"}
}
print(employee["emp2"]["dept"]) # ➤ IT📌 Use Case: Representing key-value-based relational data.
🧪 How to Traverse Nested Structures
🔄 Loop through List of Lists
matrix = [[1, 2], [3, 4]]
for row in matrix:
for val in row:
print(val)🔄 Loop through List of Dicts
for student in students:
print(student['name'])🔄 Loop through Dict of Lists
for course, topics in courses.items():
print(f"{course} includes:")
for topic in topics:
print(f" - {topic}")🛠️ Best Practices
✅ Keep data structured and readable
✅ Access nested elements with safe indexing (get(), try-except)
✅ Use functions or helper methods to extract deep values
✅ Use list comprehensions for concise filtering/extraction
🧹 Example: Extract All Ages from a List of Dictionaries
students = [
{"name": "Alice", "age": 22},
{"name": "Bob", "age": 23},
{"name": "Charlie", "age": 21}
]
ages = [student['age'] for student in students]
print(ages) # ➤ [22, 23, 21]🧰 Built-in Functions Helpful for Nested Data
Function | Use Case |
|---|---|
| Check length of nested elements |
| Identify nested data types |
| Safely access dictionary keys |
| Verify type before access |
| Convert JSON string to Python |
<div class="infographic-pynest">
<style>
.infographic-pynest {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--mono-font: 'IBM Plex Mono', 'SFMono-Regular', Menlo, monospace;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
--d0: #2563eb; --d0-soft: #e3ebfd;
--d1: #1f9d55; --d1-soft: #e3f5ec;
--d2: #b45309; --d2-soft: #fdf0dc;
--d3: #9333ea; --d3-soft: #f3e8fd;
--d4: #c0392b; --d4-soft: #fbe9e7;
box-sizing: border-box;
max-width: 860px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pynest[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--d0: #5b8def; --d0-soft: #202942;
--d1: #6fdc8c; --d1-soft: #16342a;
--d2: #e0a458; --d2-soft: #3a2c14;
--d3: #c58af2; --d3-soft: #2e2140;
--d4: #e57373; --d4-soft: #3a2222;
}
.infographic-pynest *, .infographic-pynest *::before, .infographic-pynest *::after { box-sizing: border-box; }
.infographic-pynest .pn-wrap { padding: 0 clamp(1rem, 4vw, 2rem) 1.5rem; }
.infographic-pynest h1 {
font-family: var(--display-font); font-weight: 600;
font-size: clamp(1.5rem, 5vw, 2.05rem); text-align: center; margin: 1.5rem 0 0.25rem; letter-spacing: -0.01em;
}
.infographic-pynest .pn-sub { text-align: center; color: var(--ink-soft); font-size: 0.86rem; margin: 0 0 1.4rem; }
.infographic-pynest .pn-tabs { display: flex; justify-content: center; gap: 0.35rem; margin-bottom: 1.4rem; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.infographic-pynest .pn-tab-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.75rem; font-weight: 700;
background: none; border: none; border-bottom: 2.5px solid transparent; color: var(--ink-soft);
padding: 0.5rem 0.65rem; cursor: pointer; margin-bottom: -1px;
}
.infographic-pynest .pn-tab-btn.is-active { color: var(--accent); border-bottom-color: var(--accent); }
.infographic-pynest .pn-panel.is-hidden-tab { display: none; }
.infographic-pynest .pn-decl {
text-align: center; font-family: var(--mono-font); font-size: 0.8rem; color: var(--ink-soft);
margin-bottom: 1rem;
}
.infographic-pynest .pn-decl strong { color: var(--ink); }
.infographic-pynest .tree-stage {
display: flex; justify-content: center; margin-bottom: 1.1rem; overflow-x: auto; padding: 0.4rem;
}
/* generic node styling, colored by depth */
.infographic-pynest .node { font-family: var(--mono-font); font-size: 0.78rem; }
.infographic-pynest .node-container {
border: 2px solid var(--line); border-radius: 8px; padding: 0.5rem 0.55rem 0.4rem;
cursor: pointer; position: relative; margin-top: 0.6rem;
}
.infographic-pynest .node-tag {
position: absolute; top: -0.62rem; left: 0.5rem; font-size: 0.62rem; font-weight: 700;
background: var(--paper); padding: 0 0.3rem; letter-spacing: 0.02em;
}
.infographic-pynest .node-list-body { display: flex; flex-wrap: wrap; gap: 0.4rem; align-items: flex-start; }
.infographic-pynest .node-dict-body { display: flex; flex-direction: column; gap: 0.35rem; }
.infographic-pynest .dict-row { display: flex; align-items: flex-start; gap: 0.35rem; }
.infographic-pynest .dict-key { font-weight: 700; color: var(--ink-soft); white-space: nowrap; padding-top: 0.35rem; }
.infographic-pynest .node-leaf {
display: inline-block; padding: 0.35rem 0.55rem; border-radius: 6px; border: 1.5px solid var(--line);
background: var(--paper-alt); font-weight: 700; cursor: pointer; color: var(--ink);
}
.infographic-pynest .node.is-selected.node-leaf { box-shadow: 0 0 0 2px var(--accent); }
.infographic-pynest .node.is-selected.node-container { box-shadow: 0 0 0 2px var(--accent); }
.infographic-pynest .d0 { border-color: var(--d0); } .infographic-pynest .d0 .node-tag { color: var(--d0); }
.infographic-pynest .d1 { border-color: var(--d1); } .infographic-pynest .d1 .node-tag { color: var(--d1); }
.infographic-pynest .d2 { border-color: var(--d2); } .infographic-pynest .d2 .node-tag { color: var(--d2); }
.infographic-pynest .d3 { border-color: var(--d3); } .infographic-pynest .d3 .node-tag { color: var(--d3); }
.infographic-pynest .d4 { border-color: var(--d4); } .infographic-pynest .d4 .node-tag { color: var(--d4); }
.infographic-pynest .leaf-d0 { border-color: var(--d0); background: var(--d0-soft); color: var(--d0); }
.infographic-pynest .leaf-d1 { border-color: var(--d1); background: var(--d1-soft); color: var(--d1); }
.infographic-pynest .leaf-d2 { border-color: var(--d2); background: var(--d2-soft); color: var(--d2); }
.infographic-pynest .leaf-d3 { border-color: var(--d3); background: var(--d3-soft); color: var(--d3); }
.infographic-pynest .leaf-d4 { border-color: var(--d4); background: var(--d4-soft); color: var(--d4); }
.infographic-pynest .result-box {
background: var(--paper-alt); border: 1px solid var(--line); border-radius: 8px;
padding: 0.8rem 1rem; margin-top: 0.8rem;
}
.infographic-pynest .result-row { display: flex; gap: 0.5rem; font-family: var(--mono-font); font-size: 0.82rem; margin-bottom: 0.3rem; flex-wrap: wrap; }
.infographic-pynest .result-row:last-child { margin-bottom: 0; }
.infographic-pynest .result-row .tag { color: var(--ink-soft); font-weight: 700; width: 44px; flex: none; }
.infographic-pynest .result-row .val { color: var(--accent); font-weight: 700; word-break: break-word; }
.infographic-pynest .depth-legend { display: flex; justify-content: center; gap: 0.7rem; margin-bottom: 1rem; flex-wrap: wrap; }
.infographic-pynest .depth-legend span { font-family: var(--mono-font); font-size: 0.68rem; color: var(--ink-soft); display: flex; align-items: center; gap: 0.25rem; }
.infographic-pynest .swatch { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
@media (prefers-reduced-motion: reduce) {
.infographic-pynest *, .infographic-pynest *::before, .infographic-pynest *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="pn-wrap">
<h1>Nested Data Structures</h1>
<p class="pn-sub">Lists inside dicts, dicts inside lists — tap any piece to see how you'd reach it.</p>
<div class="depth-legend">
<span><span class="swatch" style="background:var(--d0)"></span>depth 0</span>
<span><span class="swatch" style="background:var(--d1)"></span>depth 1</span>
<span><span class="swatch" style="background:var(--d2)"></span>depth 2</span>
<span><span class="swatch" style="background:var(--d3)"></span>depth 3</span>
</div>
<div class="pn-tabs">
<button class="pn-tab-btn is-active" data-tab="matrix">List of Lists</button>
<button class="pn-tab-btn" data-tab="lod">List of Dicts</button>
<button class="pn-tab-btn" data-tab="dol">Dict of Lists</button>
<button class="pn-tab-btn" data-tab="dod">Dict of Dicts</button>
<button class="pn-tab-btn" data-tab="deep">Deep Mix</button>
</div>
<div id="tabsHost"></div>
</div>
<script>
(function () {
var root = document.currentScript.closest('.infographic-pynest')
|| document.querySelector('.infographic-pynest');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) root.setAttribute('data-theme', 'dark');
/* ---------------- data examples ---------------- */
var examples = {
matrix: {
varName: 'matrix',
decl: 'matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]',
data: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
},
lod: {
varName: 'users',
decl: 'users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]',
data: [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }]
},
dol: {
varName: 'grades',
decl: 'grades = {"Alice": [90, 85, 88], "Bob": [70, 75, 80]}',
data: { Alice: [90, 85, 88], Bob: [70, 75, 80] }
},
dod: {
varName: 'inventory',
decl: 'inventory = {"apple": {"price": 1.5, "qty": 10}, "banana": {"price": 0.5, "qty": 20}}',
data: { apple: { price: 1.5, qty: 10 }, banana: { price: 0.5, qty: 20 } }
},
deep: {
varName: 'company',
decl: 'company = {"name": "Acme", "employees": [{"name": "Alice", "skills": ["Python", "SQL"]}, {"name": "Bob", "skills": ["Java"]}]}',
data: {
name: 'Acme',
employees: [
{ name: 'Alice', skills: ['Python', 'SQL'] },
{ name: 'Bob', skills: ['Java'] }
]
}
}
};
/* ---------------- helpers ---------------- */
function pyRepr(v) {
if (Array.isArray(v)) return '[' + v.map(pyRepr).join(', ') + ']';
if (v !== null && typeof v === 'object') {
return '{' + Object.keys(v).map(function (k) { return '"' + k + '": ' + pyRepr(v[k]); }).join(', ') + '}';
}
if (typeof v === 'string') return '"' + v + '"';
return String(v);
}
function depthClass(d) { return 'd' + (d % 5); }
function leafDepthClass(d) { return 'leaf-d' + (d % 5); }
/* builds the DOM for one tab: container tree + result box, with its own selection state */
function buildTab(key, cfg) {
var wrap = document.createElement('div');
wrap.className = 'pn-panel' + (key === 'matrix' ? '' : ' is-hidden-tab');
wrap.dataset.tabKey = key;
var decl = document.createElement('p');
decl.className = 'pn-decl';
decl.innerHTML = cfg.decl.replace(cfg.varName, '<strong>' + cfg.varName + '</strong>');
wrap.appendChild(decl);
var stage = document.createElement('div');
stage.className = 'tree-stage';
wrap.appendChild(stage);
var resultBox = document.createElement('div');
resultBox.className = 'result-box';
resultBox.innerHTML =
'<div class="result-row"><span class="tag">path</span><span class="val" data-role="path">' + cfg.varName + '</span></div>' +
'<div class="result-row"><span class="tag">value</span><span class="val" data-role="value">' + escapeHtml(pyRepr(cfg.data)) + '</span></div>';
wrap.appendChild(resultBox);
var pathEl = resultBox.querySelector('[data-role="path"]');
var valueEl = resultBox.querySelector('[data-role="value"]');
var selectedEl = null;
function select(el, pathExpr, value) {
if (selectedEl) selectedEl.classList.remove('is-selected');
selectedEl = el;
el.classList.add('is-selected');
pathEl.textContent = pathExpr;
valueEl.textContent = pyRepr(value);
}
function escapeHtml(s) {
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
}
function buildNode(value, pathExpr, depth) {
if (Array.isArray(value)) {
var box = document.createElement('div');
box.className = 'node node-container ' + depthClass(depth);
var tag = document.createElement('span');
tag.className = 'node-tag';
tag.textContent = 'list';
box.appendChild(tag);
var body = document.createElement('div');
body.className = 'node-list-body';
value.forEach(function (item, i) {
body.appendChild(buildNode(item, pathExpr + '[' + i + ']', depth + 1));
});
box.appendChild(body);
box.addEventListener('click', function (e) {
e.stopPropagation();
select(box, pathExpr, value);
});
return box;
}
if (value !== null && typeof value === 'object') {
var dbox = document.createElement('div');
dbox.className = 'node node-container ' + depthClass(depth);
var dtag = document.createElement('span');
dtag.className = 'node-tag';
dtag.textContent = 'dict';
dbox.appendChild(dtag);
var dbody = document.createElement('div');
dbody.className = 'node-dict-body';
Object.keys(value).forEach(function (k) {
var row = document.createElement('div');
row.className = 'dict-row';
var kEl = document.createElement('span');
kEl.className = 'dict-key';
kEl.textContent = '"' + k + '":';
row.appendChild(kEl);
row.appendChild(buildNode(value[k], pathExpr + '["' + k + '"]', depth + 1));
dbody.appendChild(row);
});
dbox.appendChild(dbody);
dbox.addEventListener('click', function (e) {
e.stopPropagation();
select(dbox, pathExpr, value);
});
return dbox;
}
// leaf
var leaf = document.createElement('span');
leaf.className = 'node node-leaf ' + leafDepthClass(depth);
leaf.textContent = typeof value === 'string' ? '"' + value + '"' : String(value);
leaf.addEventListener('click', function (e) {
e.stopPropagation();
select(leaf, pathExpr, value);
});
return leaf;
}
stage.appendChild(buildNode(cfg.data, cfg.varName, 0));
return wrap;
}
var host = root.querySelector('#tabsHost');
Object.keys(examples).forEach(function (key) {
host.appendChild(buildTab(key, examples[key]));
});
/* ---------------- tabs ---------------- */
var tabBtns = root.querySelectorAll('.pn-tab-btn');
tabBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
tabBtns.forEach(function (b) { b.classList.toggle('is-active', b === btn); });
var target = btn.dataset.tab;
host.querySelectorAll('.pn-panel').forEach(function (panel) {
panel.classList.toggle('is-hidden-tab', panel.dataset.tabKey !== target);
});
});
});
})();
</script>
</div>