A dictionary is an unordered, mutable collection of key-value pairs. Each key is unique and maps to a value.
person = {"name": "Alice", "age": 30}🔍 Why Use Dictionaries?
To store related data as pairs (like name–age, word–meaning, username–password).
Allows fast lookups using keys.
Flexible and widely used in real-world data structures (like JSON).
📌 Common Dictionary Operations
person["age"] = 31 # ✅ Update existing value
person["city"] = "Delhi" # ✅ Add new key-value pair
print(person["name"]) # ✅ Access value by keyYou can also remove a key:
del person["age"]🔄 Looping Through a Dictionary
for key, value in person.items():
print(key, ":", value)name : Alice
age : 31
city : Delhi💡 Real-life Analogy
A dictionary is like a real-life dictionary:
You look up a word (key) and get its meaning (value).
<div class="infographic-pydict">
<style>
.infographic-pydict {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--error: #c0392b;
--error-soft: #fbe9e7;
--val-c: #1f9d55;
--val-soft: #e3f5ec;
--mono-font: 'IBM Plex Mono', 'SFMono-Regular', Menlo, monospace;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
box-sizing: border-box;
max-width: 800px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pydict[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--error: #e57373;
--error-soft: #3a2222;
--val-c: #6fdc8c;
--val-soft: #16342a;
}
.infographic-pydict *, .infographic-pydict *::before, .infographic-pydict *::after { box-sizing: border-box; }
.infographic-pydict .pd-wrap { padding: 0 clamp(1rem, 4vw, 2rem) 1.5rem; }
.infographic-pydict h1 {
font-family: var(--display-font); font-weight: 600;
font-size: clamp(1.55rem, 5vw, 2.1rem); text-align: center; margin: 1.5rem 0 0.25rem; letter-spacing: -0.01em;
}
.infographic-pydict .pd-sub { text-align: center; color: var(--ink-soft); font-size: 0.88rem; margin: 0 0 1.4rem; }
.infographic-pydict .pd-tabs { display: flex; justify-content: center; gap: 0.4rem; margin-bottom: 1.5rem; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.infographic-pydict .pd-tab-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.8rem; font-weight: 700;
background: none; border: none; border-bottom: 2.5px solid transparent; color: var(--ink-soft);
padding: 0.55rem 0.8rem; cursor: pointer; margin-bottom: -1px;
}
.infographic-pydict .pd-tab-btn.is-active { color: var(--accent); border-bottom-color: var(--accent); }
.infographic-pydict .pd-panel.is-hidden-tab { display: none; }
/* key:value pill row */
.infographic-pydict .pair-row { display: flex; justify-content: center; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 0.6rem; min-height: 50px; align-items: center; }
.infographic-pydict .pair-box {
display: flex; align-items: center; gap: 0.3rem; padding: 0.35rem 0.6rem;
background: var(--paper-alt); border: 1.5px solid var(--line); border-radius: 8px;
font-family: var(--mono-font); font-size: 0.8rem; animation: pd-pop-in 0.25s ease;
}
@keyframes pd-pop-in { from { opacity: 0; transform: scale(0.7); } to { opacity: 1; transform: scale(1); } }
.infographic-pydict .pair-key { font-weight: 700; color: var(--accent); padding: 0.1rem 0.3rem; border-radius: 4px; transition: background 0.2s, color 0.2s; }
.infographic-pydict .pair-colon { color: var(--ink-soft); }
.infographic-pydict .pair-val { font-weight: 700; color: var(--val-c); padding: 0.1rem 0.3rem; border-radius: 4px; transition: background 0.2s, color 0.2s; }
.infographic-pydict .pair-key.is-dim, .infographic-pydict .pair-val.is-dim { color: var(--ink-soft); opacity: 0.4; }
.infographic-pydict .pair-key.is-hl { background: var(--accent-soft); }
.infographic-pydict .pair-val.is-hl { background: var(--val-soft); }
.infographic-pydict .pair-box.is-shake { animation: pd-shake 0.4s; border-color: var(--error); background: var(--error-soft); }
@keyframes pd-shake {
0%, 100% { transform: translateX(0); } 20% { transform: translateX(-4px); } 40% { transform: translateX(4px); }
60% { transform: translateX(-3px); } 80% { transform: translateX(3px); }
}
.infographic-pydict .len-badge {
display: block; text-align: center; font-family: var(--mono-font); font-size: 0.75rem; color: var(--accent);
font-weight: 700; margin-bottom: 1.1rem;
}
.infographic-pydict .pd-note { text-align: center; font-size: 0.78rem; color: var(--ink-soft); margin: -0.5rem 0 1.1rem; }
/* method cards */
.infographic-pydict .method-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.6rem; margin-bottom: 1.1rem; }
@media (max-width: 560px) { .infographic-pydict .method-grid { grid-template-columns: 1fr; } }
.infographic-pydict .method-card { background: var(--paper-alt); border: 1px solid var(--line); border-radius: 6px; padding: 0.6rem 0.7rem; }
.infographic-pydict .method-name { font-family: var(--mono-font); font-size: 0.8rem; font-weight: 700; color: var(--ink); margin-bottom: 0.4rem; }
.infographic-pydict .method-row { display: flex; gap: 0.35rem; align-items: center; flex-wrap: wrap; }
.infographic-pydict .method-row input {
font-family: var(--mono-font); font-size: 0.78rem; padding: 0.28rem 0.4rem;
border: 1px solid var(--line); border-radius: 4px; background: var(--paper); color: var(--ink); width: 76px;
}
.infographic-pydict .method-row input:focus { outline: none; border-color: var(--accent); }
.infographic-pydict .run-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.75rem; font-weight: 700;
background: var(--accent); color: #fff; border: none; border-radius: 4px;
padding: 0.3rem 0.6rem; cursor: pointer;
}
.infographic-pydict .run-btn.danger { background: var(--error); }
.infographic-pydict .reset-row { display: flex; justify-content: center; margin-bottom: 1rem; }
.infographic-pydict .reset-btn {
font: inherit; font-size: 0.78rem; font-weight: 600; color: var(--ink-soft);
background: none; border: 1px solid var(--line); padding: 0.35rem 0.7rem; cursor: pointer; border-radius: 4px;
}
/* terminal log — always dark */
.infographic-pydict .device {
--ed-bg: #1e1e1e; --ed-bar: #2d2d2d; --ed-text: #d4d4d4; --ed-soft: #8a8a8a; --ed-ok: #6fdc8c; --ed-err: #ff6b6b;
background: var(--ed-bg); border: 1px solid var(--line); border-radius: 8px; overflow: hidden;
}
.infographic-pydict .device-bar {
display: flex; align-items: center; gap: 0.4rem;
background: var(--ed-bar); padding: 0.5rem 0.7rem; border-bottom: 1px solid #3a3a3a;
font-size: 0.72rem; color: var(--ed-soft); font-weight: 600;
}
.infographic-pydict .device-bar .dot { width: 9px; height: 9px; border-radius: 50%; background: #5a5a5a; }
.infographic-pydict .device-bar .dot:nth-child(1) { background: #ff5f56; }
.infographic-pydict .device-body {
padding: 0.8rem 0.9rem; font-family: var(--mono-font); font-size: 0.78rem; color: var(--ed-text);
min-height: 50px; max-height: 170px; overflow-y: auto;
}
.infographic-pydict .log-line { display: flex; gap: 0.5rem; line-height: 1.6; opacity: 0; animation: pd-fadein 0.25s ease forwards; flex-wrap: wrap; }
@keyframes pd-fadein { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: translateY(0); } }
.infographic-pydict .log-line .p { color: var(--ed-ok); font-weight: 700; }
.infographic-pydict .log-line .arrow { color: var(--ed-soft); }
.infographic-pydict .log-line .res { color: #fff; }
.infographic-pydict .log-line.err .res { color: var(--ed-err); }
.infographic-pydict .log-empty { color: var(--ed-soft); }
/* views tab */
.infographic-pydict .view-btn-row { display: flex; justify-content: center; gap: 0.4rem; margin-bottom: 1.2rem; flex-wrap: wrap; }
.infographic-pydict .view-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.82rem; font-weight: 700;
background: var(--paper-alt); border: 1.5px solid var(--line); color: var(--ink-soft);
padding: 0.5rem 0.85rem; cursor: pointer; border-radius: 5px;
}
.infographic-pydict .view-btn.is-selected { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
.infographic-pydict .view-result {
text-align: center; font-family: var(--mono-font); font-size: 0.85rem; font-weight: 700; color: var(--accent);
margin: 0.9rem 0 0.4rem; word-break: break-word;
}
@media (prefers-reduced-motion: reduce) {
.infographic-pydict *, .infographic-pydict *::before, .infographic-pydict *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="pd-wrap">
<h1>Python Dictionaries</h1>
<p class="pd-sub">Key : value pairs, in the order you added them.</p>
<div class="pd-tabs">
<button class="pd-tab-btn is-active" data-tab="methods">Add, Update, Remove</button>
<button class="pd-tab-btn" data-tab="views">Views</button>
</div>
<!-- METHODS TAB -->
<div class="pd-panel" id="tabMethods">
<div class="pair-row" id="methodsRow"></div>
<span class="len-badge" id="methodsLenBadge">len(user) = 3</span>
<p class="pd-note">user = {"name": "Alice", "age": 25, "city": "NYC"}</p>
<div class="method-grid">
<div class="method-card">
<div class="method-name">d[key] = value</div>
<div class="method-row">
<input id="setKey" type="text" value="age" style="width:64px" />
<input id="setVal" type="text" value="26" />
<button class="run-btn" data-method="set">Run</button>
</div>
</div>
<div class="method-card">
<div class="method-name">d[key]</div>
<div class="method-row">
<input id="getKey" type="text" value="country" />
<button class="run-btn" data-method="direct">Run</button>
</div>
</div>
<div class="method-card">
<div class="method-name">.get(key, default)</div>
<div class="method-row">
<input id="getKey2" type="text" value="country" style="width:64px" />
<input id="getDefault" type="text" value="unknown" />
<button class="run-btn" data-method="get">Run</button>
</div>
</div>
<div class="method-card">
<div class="method-name">key in d</div>
<div class="method-row">
<input id="inKey" type="text" value="name" />
<button class="run-btn" data-method="in">Run</button>
</div>
</div>
<div class="method-card">
<div class="method-name">del d[key]</div>
<div class="method-row">
<input id="delKey" type="text" value="city" />
<button class="run-btn danger" data-method="del">Run</button>
</div>
</div>
<div class="method-card">
<div class="method-name">.pop(key)</div>
<div class="method-row">
<input id="popKey" type="text" value="age" />
<button class="run-btn danger" data-method="pop">Run</button>
</div>
</div>
</div>
<div class="reset-row"><button class="reset-btn" id="methodsReset">↺ Reset dict</button></div>
<div class="device">
<div class="device-bar"><span class="dot"></span><span class="dot"></span><span class="dot"></span> History</div>
<div class="device-body" id="methodsLog"><div class="log-empty">Run a method to see it here…</div></div>
</div>
</div>
<!-- VIEWS TAB -->
<div class="pd-panel is-hidden-tab" id="tabViews">
<div class="pair-row" id="viewsRow"></div>
<span class="len-badge" id="viewsLenBadge">len(user) = 3</span>
<div class="view-btn-row">
<button class="view-btn is-selected" data-view="items">.items()</button>
<button class="view-btn" data-view="keys">.keys()</button>
<button class="view-btn" data-view="values">.values()</button>
</div>
<div class="view-result" id="viewResult"></div>
<p class="pd-note">Dicts keep insertion order — the view always matches what you see above.</p>
</div>
</div>
<script>
(function () {
var root = document.currentScript.closest('.infographic-pydict')
|| document.querySelector('.infographic-pydict');
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');
/* ---------------- tabs ---------------- */
var tabBtns = root.querySelectorAll('.pd-tab-btn');
var panels = {
methods: root.querySelector('#tabMethods'),
views: root.querySelector('#tabViews')
};
tabBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
tabBtns.forEach(function (b) { b.classList.toggle('is-active', b === btn); });
var target = btn.dataset.tab;
Object.keys(panels).forEach(function (key) {
panels[key].classList.toggle('is-hidden-tab', key !== target);
});
if (target === 'views') renderViews();
});
});
/* ---------------- shared dict state (array of {k,v} preserves order) ---------------- */
var INITIAL = [{ k: 'name', v: 'Alice' }, { k: 'age', v: '25' }, { k: 'city', v: 'NYC' }];
var entries = INITIAL.map(function (e) { return { k: e.k, v: e.v }; });
function findEntry(key) {
for (var i = 0; i < entries.length; i++) if (entries[i].k === key) return i;
return -1;
}
function pyDictRepr(list) {
if (list.length === 0) return '{}';
return '{' + list.map(function (e) { return '"' + e.k + '": "' + e.v + '"'; }).join(', ') + '}';
}
function logLine(logEl, code, result, isErr) {
var line = document.createElement('div');
line.className = 'log-line' + (isErr ? ' err' : '');
line.innerHTML = '<span class="p">>>></span><span>' + code + '</span>' +
(result !== undefined ? '<span class="arrow">→</span><span class="res">' + result + '</span>' : '');
logEl.appendChild(line);
logEl.scrollTop = logEl.scrollHeight;
}
function renderPairRow(container, list) {
container.innerHTML = '';
list.forEach(function (e) {
var box = document.createElement('div');
box.className = 'pair-box';
box.dataset.key = e.k;
var kSpan = document.createElement('span');
kSpan.className = 'pair-key';
kSpan.textContent = '"' + e.k + '"';
var colon = document.createElement('span');
colon.className = 'pair-colon';
colon.textContent = ':';
var vSpan = document.createElement('span');
vSpan.className = 'pair-val';
vSpan.textContent = '"' + e.v + '"';
box.appendChild(kSpan);
box.appendChild(colon);
box.appendChild(vSpan);
container.appendChild(box);
});
}
/* ---------------- METHODS TAB ---------------- */
var methodsRow = root.querySelector('#methodsRow');
var methodsLenBadge = root.querySelector('#methodsLenBadge');
var methodsLog = root.querySelector('#methodsLog');
var methodsFirstLog = true;
function renderMethods() {
renderPairRow(methodsRow, entries);
methodsLenBadge.textContent = 'len(user) = ' + entries.length;
}
function flashBox(key) {
var box = methodsRow.querySelector('[data-key="' + CSS.escape(key) + '"]');
if (box) {
box.classList.remove('is-shake');
void box.offsetWidth;
box.style.transition = 'none';
box.style.transform = 'translateY(-3px)';
setTimeout(function () { box.style.transition = ''; box.style.transform = ''; }, 350);
}
}
function shakeBox(key) {
var box = methodsRow.querySelector('[data-key="' + CSS.escape(key) + '"]');
if (box) {
box.classList.remove('is-shake');
void box.offsetWidth;
box.classList.add('is-shake');
setTimeout(function () { box.classList.remove('is-shake'); }, 450);
}
}
root.querySelectorAll('#tabMethods .run-btn').forEach(function (btn) {
btn.addEventListener('click', function () {
var method = btn.dataset.method;
if (methodsFirstLog) { methodsLog.innerHTML = ''; methodsFirstLog = false; }
if (method === 'set') {
var k = root.querySelector('#setKey').value.trim();
var v = root.querySelector('#setVal').value.trim();
if (!k) return;
var pos = findEntry(k);
if (pos === -1) {
entries.push({ k: k, v: v });
logLine(methodsLog, 'user["' + k + '"] = "' + v + '"', pyDictRepr(entries));
} else {
entries[pos].v = v;
logLine(methodsLog, 'user["' + k + '"] = "' + v + '"', 'key existed — value updated');
}
renderMethods();
flashBox(k);
} else if (method === 'direct') {
var k2 = root.querySelector('#getKey').value.trim();
var pos2 = findEntry(k2);
if (pos2 === -1) {
logLine(methodsLog, 'user["' + k2 + '"]', "KeyError: '" + k2 + "'", true);
} else {
logLine(methodsLog, 'user["' + k2 + '"]', '"' + entries[pos2].v + '"');
flashBox(k2);
}
} else if (method === 'get') {
var k3 = root.querySelector('#getKey2').value.trim();
var def = root.querySelector('#getDefault').value.trim();
var pos3 = findEntry(k3);
if (pos3 === -1) {
logLine(methodsLog, 'user.get("' + k3 + '", "' + def + '")', '"' + def + '" (key missing, no error)');
} else {
logLine(methodsLog, 'user.get("' + k3 + '", "' + def + '")', '"' + entries[pos3].v + '"');
flashBox(k3);
}
} else if (method === 'in') {
var k4 = root.querySelector('#inKey').value.trim();
var found = findEntry(k4) !== -1;
logLine(methodsLog, '"' + k4 + '" in user', found ? 'True' : 'False');
if (found) flashBox(k4);
} else if (method === 'del') {
var k5 = root.querySelector('#delKey').value.trim();
var pos5 = findEntry(k5);
if (pos5 === -1) {
logLine(methodsLog, 'del user["' + k5 + '"]', "KeyError: '" + k5 + "'", true);
} else {
shakeBox(k5);
setTimeout(function () {
entries.splice(pos5, 1);
renderMethods();
}, 250);
logLine(methodsLog, 'del user["' + k5 + '"]', pyDictRepr(entries.filter(function (e) { return e.k !== k5; })));
}
} else if (method === 'pop') {
var k6 = root.querySelector('#popKey').value.trim();
var pos6 = findEntry(k6);
if (pos6 === -1) {
logLine(methodsLog, 'user.pop("' + k6 + '")', "KeyError: '" + k6 + "'", true);
} else {
var poppedVal = entries[pos6].v;
shakeBox(k6);
setTimeout(function () {
entries.splice(pos6, 1);
renderMethods();
}, 250);
logLine(methodsLog, 'user.pop("' + k6 + '")', '"' + poppedVal + '"');
}
}
});
});
root.querySelector('#methodsReset').addEventListener('click', function () {
entries = INITIAL.map(function (e) { return { k: e.k, v: e.v }; });
methodsFirstLog = true;
methodsLog.innerHTML = '<div class="log-empty">Run a method to see it here…</div>';
renderMethods();
});
/* ---------------- VIEWS TAB ---------------- */
var viewsRow = root.querySelector('#viewsRow');
var viewsLenBadge = root.querySelector('#viewsLenBadge');
var viewBtns = root.querySelectorAll('.view-btn');
var viewResult = root.querySelector('#viewResult');
var currentView = 'items';
function renderViews() {
renderPairRow(viewsRow, entries);
viewsLenBadge.textContent = 'len(user) = ' + entries.length;
var keySpans = viewsRow.querySelectorAll('.pair-key');
var valSpans = viewsRow.querySelectorAll('.pair-val');
keySpans.forEach(function (el) { el.classList.remove('is-hl', 'is-dim'); });
valSpans.forEach(function (el) { el.classList.remove('is-hl', 'is-dim'); });
if (currentView === 'keys') {
keySpans.forEach(function (el) { el.classList.add('is-hl'); });
valSpans.forEach(function (el) { el.classList.add('is-dim'); });
viewResult.textContent = 'user.keys() = dict_keys([' + entries.map(function (e) { return '"' + e.k + '"'; }).join(', ') + '])';
} else if (currentView === 'values') {
valSpans.forEach(function (el) { el.classList.add('is-hl'); });
keySpans.forEach(function (el) { el.classList.add('is-dim'); });
viewResult.textContent = 'user.values() = dict_values([' + entries.map(function (e) { return '"' + e.v + '"'; }).join(', ') + '])';
} else {
keySpans.forEach(function (el) { el.classList.add('is-hl'); });
valSpans.forEach(function (el) { el.classList.add('is-hl'); });
viewResult.textContent = 'user.items() = dict_items([' + entries.map(function (e) { return '("' + e.k + '", "' + e.v + '")'; }).join(', ') + '])';
}
}
viewBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
viewBtns.forEach(function (b) { b.classList.toggle('is-selected', b === btn); });
currentView = btn.dataset.view;
renderViews();
});
});
renderMethods();
renderViews();
})();
</script>
</div>