{ "cells": [ { "cell_type": "raw", "id": "569c7432", "metadata": {}, "source": [ "---\n", "title: \"Notebook 5: Collections & Abstract Data Types\"\n", "subtitle: \"COMP 1150 โ€” Computer Science Concepts\"\n", "author: \"Brendan Shea, PhD\"\n", "date: last-modified\n", "---" ] }, { "cell_type": "markdown", "id": "e54fdbb6", "metadata": { "colab_header": true }, "source": [ "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/brendanpshea/computing_concepts_python/blob/main/v2/notebooks/COMP1150_NB05_CollectionsADTs.ipynb) \n", "[Download .ipynb](https://raw.githubusercontent.com/brendanpshea/computing_concepts_python/main/v2/notebooks/COMP1150_NB05_CollectionsADTs.ipynb) ยท [View on GitHub](https://github.com/brendanpshea/computing_concepts_python/blob/main/v2/notebooks/COMP1150_NB05_CollectionsADTs.ipynb)\n" ] }, { "cell_type": "markdown", "id": "a8e2b7e6", "metadata": {}, "source": [ "๐Ÿ“บ **Lecture video:** *(link coming soon)*" ] }, { "cell_type": "markdown", "id": "46246c5d", "metadata": {}, "source": [ "## Learning Outcomes\n", "\n", "By the end of this notebook, you will be able to:\n", "\n", "- **Choose** the right Python collection โ€” list, tuple, dict, or set โ€” for a given task and justify the choice.\n", "- **Use** indexing, slicing, key lookup, sorting, and set operations to read, update, and re-shape data.\n", "- **Diagnose** an aliasing bug, where two names point at the same list.\n", "- **Read and build nested data** โ€” a list of dictionaries โ€” the shape that almost every real dataset takes.\n", "- **Rewrite** small loops as list and dictionary **comprehensions**.\n", "- **Explain** the difference between an **abstract data type** (the promise) and its **implementation** (the storage), and implement a small ADT yourself.\n", "\n", "*Maps to course LOs: 6, 8*" ] }, { "cell_type": "markdown", "id": "28cd2485", "metadata": {}, "source": [ "## The Big Contract\n", "\n", "Welcome to **The Midnight Masquerade**, a delightfully creaky costume emporium where six rather famous monsters share one shop floor and a single, much-abused cash register. The lighting flickers on purpose, the cobwebs are *decorative*, and โ€” to everyone's eternal frustration โ€” absolutely nothing runs on paper any more.\n", "\n", "| Department | Proprietor | Today's headache |\n", "|---|---|---|\n", "| **Rentals Desk** | Count Dracula | the order list is a heap of bat-shaped sticky notes |\n", "| **Fittings & Deposits** | Dr. Victoria Frankenstein | every client has the *same* four fields, in the *same* order, forever |\n", "| **Masks & Millinery** | The Phantom | nobody can remember the price of a half-mask |\n", "| **Masquerade Balls** | Camilla | two guest lists overlap and she needs to know by *whom* |\n", "| **Fitting Rooms** | Mr. Hyde | customers form a line and no one knows whose turn it is |\n", "| **Alterations** | Cthulhu | every costume needs the same small adjustment |\n", "\n", "Each problem is really the same question in different (rather gothic) clothing: **what shape of data fits the job?**" ] }, { "cell_type": "markdown", "id": "9dad68c8", "metadata": {}, "source": [ "## The Roadmap\n", "\n", "| Part | Department | What you'll learn |\n", "|---|---|---|\n", "| Lists | Dracula's Rentals Desk | ordered, changeable sequences |\n", "| Aliasing | Dracula (again) | the most common list bug in Python |\n", "| Tuples | Frankenstein's Fittings | fixed records you don't mean to edit |\n", "| Dictionaries | The Phantom's Masks | look up a value by its label; sort by it |\n", "| Sets | Camilla's Masquerade Balls | membership, overlap, uniqueness |\n", "| Nested collections | Camilla's guest list | lists of dicts โ€” real-data shape |\n", "| ADTs | Hyde's Fitting Rooms | the *promise* of a collection vs. its *storage* |\n", "\n", "Most code cells open with a `# โฌ‡๏ธ CHANGE THIS, THEN RE-RUN` block. Edit the values, press *Run*, watch the output move. That is the study method." ] }, { "cell_type": "markdown", "id": "f71ab61a", "metadata": {}, "source": [ "## Lists: Ordered Things You Can Still Change\n", "\n", "**Count Dracula** works the Rentals Desk at The Midnight Masquerade. Customers shamble up all evening asking for costumes, and Dracula wants them recorded **in the order they arrived** โ€” first come, first served, no exceptions (he is, after all, a stickler for proper queueing etiquette dating back several centuries). He also reserves the right to cross items off, add a forgotten one, or revise a misheard request.\n", "\n", "That is a **list**: a row of items kept in order, with a position (an **index**) for each one, and free permission to change the contents later.\n", "\n", "**Writing a list, reading an item.** You write a list as comma-separated values between **square brackets**, and you reach an item by its **index** (its position) in another pair of square brackets:\n", "\n", "```python\n", "my_list = [item0, item1, item2] # the [ ] make it a list; commas separate items\n", "my_list[0] # read the item at position 0 โ€” the first one\n", "len(my_list) # how many items the list holds\n", "```\n", "\n", "Python numbers positions from **0**, so the first item is `my_list[0]` and the third is `my_list[2]`. Keep that in mind as you read the example below." ] }, { "cell_type": "code", "execution_count": 1, "id": "f7aa11df", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:50.412164Z", "iopub.status.busy": "2026-06-02T14:23:50.411493Z", "iopub.status.idle": "2026-06-02T14:23:50.431751Z", "shell.execute_reply": "2026-06-02T14:23:50.428386Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['vampire cape', 'fake fangs, deluxe', 'two bat masks', 'coffin (rental)']\n", "How many orders tonight? 4\n" ] } ], "source": [ "# โฌ‡๏ธ CHANGE THIS, THEN RE-RUN\n", "tonights_orders = [\"vampire cape\", \"fake fangs, deluxe\", \"two bat masks\", \"coffin (rental)\"]\n", "# ----------------------------------\n", "\n", "print(tonights_orders)\n", "print(\"How many orders tonight?\", len(tonights_orders))" ] }, { "cell_type": "markdown", "id": "2f0d80e3", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `tonights_orders` is a **list** โ€” the square brackets `[ ]` are how Python recognises one.\n", "- The items keep the order they were written in. The first entry is at **index 0**, not 1. Dracula reads top-down; Python counts from zero. (Dracula, who counts everything, finds this deeply satisfying.)\n", "- `len(tonights_orders)` reports the length. It is the single most-used function on a list." ] }, { "cell_type": "code", "execution_count": 2, "id": "57bc5402", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "lst\n", "\n", "index 0\n", "\n", "index 1\n", "\n", "index 2\n", "\n", "index 3\n", "\n", "vampire cape\n", "\n", "fake fangs\n", "\n", "two bat masks\n", "\n", "coffin\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š A list is a row of slots, each with an index (click to show code)\n", "from graphviz import Digraph\n", "\n", "g = Digraph(graph_attr={\"rankdir\": \"TB\"})\n", "g.node(\n", " \"lst\",\n", " \"{{index 0|index 1|index 2|index 3}|\"\n", " \"{vampire cape|fake fangs|two bat masks|coffin}}\",\n", " shape=\"record\", style=\"filled\", fillcolor=\"lightblue\",\n", ")\n", "g" ] }, { "cell_type": "markdown", "id": "5912c7b5", "metadata": {}, "source": [ "### ๐Ÿ”ฎ Predict Before You Run\n", "\n", "The next cell prints three things: the item at a chosen index, the last item, and the first two items as a slice. Before pressing Run, **write down what each line will print** with `position = 0`. Then run and check. Disagreement is good โ€” that's where the learning happens." ] }, { "cell_type": "markdown", "id": "d11ce9d3", "metadata": {}, "source": [ "### Reading and Slicing\n", "\n", "Dracula wants the very first order (the urgent one) and the last (the most recent). He can ask Python by **index**.\n", "\n", "**Indexes and slices.** One number in square brackets reads a single item; two numbers split by a colon read a **slice** (a run of items):\n", "\n", "```python\n", "my_list[2] # the single item at position 2\n", "my_list[-1] # the LAST item โ€” a negative index counts back from the end\n", "my_list[0:2] # a slice: positions 0 and 1 โ€” the stop number is NOT included\n", "my_list[:2] # the same slice; a missing start means \"from the beginning\"\n", "```\n", "\n", "A slice always hands you back a **new** list; it never disturbs the original." ] }, { "cell_type": "code", "execution_count": 3, "id": "d32fb655", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:50.439394Z", "iopub.status.busy": "2026-06-02T14:23:50.438777Z", "iopub.status.idle": "2026-06-02T14:23:50.450021Z", "shell.execute_reply": "2026-06-02T14:23:50.447430Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Item at position 0 โ†’ vampire cape\n", "Last item โ†’ coffin (rental)\n", "First two โ†’ ['vampire cape', 'fake fangs, deluxe']\n" ] } ], "source": [ "# โฌ‡๏ธ CHANGE THIS INDEX, THEN RE-RUN\n", "position = 0\n", "# ----------------------------------\n", "\n", "print(\"Item at position\", position, \"โ†’\", tonights_orders[position])\n", "print(\"Last item โ†’\", tonights_orders[-1])\n", "print(\"First two โ†’\", tonights_orders[:2])" ] }, { "cell_type": "markdown", "id": "a7d6244f", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `todays_orders[0]` is the first item. `todays_orders[-1]` is the last โ€” negative indices count back from the end.\n", "- `todays_orders[:2]` is a **slice**: a sub-list from the start up to (but not including) position 2. Slices give you a new list; the original is untouched." ] }, { "cell_type": "markdown", "id": "c169c62a", "metadata": {}, "source": [ "### Changing the List\n", "\n", "Lists are **mutable**: you can rewrite a slot, append to the end, or remove an item by value. Dracula does all three before midnight.\n", "\n", "**Three ways to change a list.** Three different jobs, three different forms:\n", "\n", "```python\n", "my_list.append(x) # add x to the END of the list\n", "my_list[i] = x # overwrite whatever is already at position i\n", "my_list.remove(x) # delete the first item equal to x\n", "```\n", "\n", "The `.append(...)` and `.remove(...)` forms are **methods** โ€” actions a list knows how to perform on itself. You write the list, a dot, then the action." ] }, { "cell_type": "code", "execution_count": 4, "id": "fd404a0b", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:50.457220Z", "iopub.status.busy": "2026-06-02T14:23:50.456520Z", "iopub.status.idle": "2026-06-02T14:23:50.465815Z", "shell.execute_reply": "2026-06-02T14:23:50.463849Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['vampire cape', 'fake fangs, glow-in-dark', 'two bat masks', 'garlic-proof gloves']\n" ] } ], "source": [ "orders = [\"vampire cape\", \"fake fangs, deluxe\", \"two bat masks\", \"coffin (rental)\"]\n", "\n", "orders.append(\"garlic-proof gloves\") # add to the end\n", "orders[1] = \"fake fangs, glow-in-dark\" # correct a misheard order\n", "orders.remove(\"coffin (rental)\") # the customer changed her mind\n", "\n", "print(orders)" ] }, { "cell_type": "markdown", "id": "9db1a8d6", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `append(x)` adds `x` to the end of the list. The list grows by one.\n", "- `orders[1] = ...` overwrites position 1. Nothing is added; one entry is replaced.\n", "- `remove(x)` deletes the **first** matching value. If the item isn't there, Python raises an error โ€” Dracula would prefer to be told than to lose a sale silently.\n", "\n", "**Takeaway:** reach for a list when the **order matters** and the contents will **change**." ] }, { "cell_type": "markdown", "id": "5604c688", "metadata": {}, "source": [ "### โœ๏ธ Your Turn โ€” Dracula's Order Cleanup\n", "\n", "Dracula hands you tonight's list with a couple of mistakes:\n", "\n", "```python\n", "orders = [\"cape\", \"fangs\", \"masks\", \"coffin\", \"fangs\", \"cane\", \"masks\"]\n", "```\n", "\n", "In the cell below: (1) replace the **second** `\"fangs\"` with `\"fangs, glow-in-dark\"`, (2) **append** `\"garlic-proof gloves\"`, (3) print the **last three** orders with a slice, and (4) print how many entries the list now has." ] }, { "cell_type": "code", "execution_count": 5, "id": "64a45eb3", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "# โฌ‡๏ธ EDIT / EXTEND THIS, THEN RE-RUN\n", "orders = [\"cape\", \"fangs\", \"masks\", \"coffin\", \"fangs\", \"cane\", \"masks\"]\n", "# ----------------------------------\n", "\n", "# TODO 1: replace the SECOND \"fangs\" (index 4) with \"fangs, glow-in-dark\"\n", "# TODO 2: append \"garlic-proof gloves\"\n", "# TODO 3: print the last three orders with a slice\n", "# TODO 4: print how many entries orders now has" ] }, { "cell_type": "markdown", "id": "87d30f08", "metadata": {}, "source": [ "## A Trap: Two Names for the Same List\n", "\n", "Dracula writes his early-evening list, then makes a \"copy\" before tweaking it for the after-midnight rush. Or so he thinks." ] }, { "cell_type": "code", "execution_count": 6, "id": "bd813349", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:50.471770Z", "iopub.status.busy": "2026-06-02T14:23:50.471203Z", "iopub.status.idle": "2026-06-02T14:23:50.480811Z", "shell.execute_reply": "2026-06-02T14:23:50.478390Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "midnight : ['cape', 'fangs', 'masks', 'coffin']\n", "dusk : ['cape', 'fangs', 'masks', 'coffin']\n" ] } ], "source": [ "dusk = [\"cape\", \"fangs\", \"masks\"]\n", "midnight = dusk # NOT a copy!\n", "\n", "midnight.append(\"coffin\") # editing midnight...\n", "\n", "print(\"midnight :\", midnight)\n", "print(\"dusk :\", dusk) # ...but dusk changed too!" ] }, { "cell_type": "markdown", "id": "cad78b0a", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "`evening = morning` does **not** make a new list. It makes a second **name** that points at the *same* list in memory. Editing through one name shows up through the other. Python calls this **aliasing**, and it catches every beginner.\n", "\n", "The diagram below is the picture of what just happened โ€” two arrows, one list." ] }, { "cell_type": "code", "execution_count": 7, "id": "b513b347", "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2026-06-02T14:23:50.486763Z", "iopub.status.busy": "2026-06-02T14:23:50.486043Z", "iopub.status.idle": "2026-06-02T14:23:51.665073Z", "shell.execute_reply": "2026-06-02T14:23:51.662758Z" }, "jupyter": { "source_hidden": true } }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "M\n", "\n", "dusk\n", "\n", "\n", "\n", "L\n", "\n", "['cape', 'fangs', 'masks', 'coffin']\n", "\n", "\n", "\n", "M->L\n", "\n", "\n", "\n", "\n", "\n", "E\n", "\n", "midnight\n", "\n", "\n", "\n", "E->L\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Aliasing diagram (click to show code)\n", "from graphviz import Digraph\n", "\n", "a = Digraph(graph_attr={\"rankdir\": \"LR\"})\n", "a.node(\"M\", \"dusk\", shape=\"ellipse\", style=\"filled\", fillcolor=\"lightyellow\")\n", "a.node(\"E\", \"midnight\", shape=\"ellipse\", style=\"filled\", fillcolor=\"lightyellow\")\n", "a.node(\"L\", \"['cape', 'fangs', 'masks', 'coffin']\",\n", " shape=\"box\", style=\"filled\", fillcolor=\"lightblue\")\n", "a.edge(\"M\", \"L\")\n", "a.edge(\"E\", \"L\")\n", "a" ] }, { "cell_type": "markdown", "id": "352c1658", "metadata": {}, "source": [ "**Reading it:** the two yellow ellipses are *names*; the blue box is the *list*. Both names point at the same list, so a change made through either name shows up through both." ] }, { "cell_type": "markdown", "id": "3d553ef1", "metadata": {}, "source": [ "### The Fix: Make a Real Copy\n", "\n", "When Dracula genuinely wants an independent second list, he uses `.copy()` (or the full slice `dusk[:]`, or `list(dusk)` โ€” all three do the same job)." ] }, { "cell_type": "code", "execution_count": 8, "id": "1ec45b8d", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.672438Z", "iopub.status.busy": "2026-06-02T14:23:51.671708Z", "iopub.status.idle": "2026-06-02T14:23:51.680204Z", "shell.execute_reply": "2026-06-02T14:23:51.678384Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "midnight : ['cape', 'fangs', 'masks', 'coffin']\n", "dusk : ['cape', 'fangs', 'masks']\n" ] } ], "source": [ "dusk = [\"cape\", \"fangs\", \"masks\"]\n", "midnight = dusk.copy() # NEW list with the same contents\n", "\n", "midnight.append(\"coffin\")\n", "\n", "print(\"midnight :\", midnight)\n", "print(\"dusk :\", dusk) # untouched" ] }, { "cell_type": "markdown", "id": "64b02792", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "`dusk.copy()` returns a fresh list with the same items inside. Now `dusk` and `midnight` are two different lists; editing one leaves the other alone.\n", "\n", "**Takeaway:** mutability is power, but it is also danger. The tuples in the next section avoid this whole family of bugs by **refusing to be edited** โ€” which is exactly why Dr. Frankenstein prefers them for permanent records." ] }, { "cell_type": "markdown", "id": "67dfa54b", "metadata": {}, "source": [ "### ๐Ÿ“‹ List Methods Cheatsheet\n", "\n", "The list operations from this section, plus a few close cousins worth knowing exist. You don't need to memorise the right-hand column โ€” just remember this table is here.\n", "\n", "| Method | What it does |\n", "|---|---|\n", "| `lst.append(x)` | Add `x` to the end |\n", "| `lst.remove(x)` | Remove first matching value (errors if absent) |\n", "| `lst.pop(i)` | Remove and return item at index `i` (default: the last) |\n", "| `lst.insert(i, x)` | Insert `x` at position `i` |\n", "| `lst.extend(other)` | Add every item of `other` to the end |\n", "| `lst.copy()` | Return a new, independent list (the fix for aliasing) |\n", "| `lst.sort(key=..., reverse=...)` | Sort **in place** โ€” returns nothing |\n", "| `sorted(lst, reverse=...)` | Return a **new** sorted list โ€” leaves `lst` alone |\n", "| `len(lst)`   โ€ข   `x in lst` | Length โ€ข membership (scans) |" ] }, { "cell_type": "markdown", "id": "d1c85986", "metadata": {}, "source": [ "## Tuples: Fixed Records\n", "\n", "**Dr. Victoria Frankenstein** runs Fittings & Deposits at the back of the shop (she is very good with measurements, having assembled at least one client from scratch). Every fitting arrives as the same four pieces of information, in the same order, *every single time*: name, height in centimetres, costume, and (most importantly) the deposit paid. She does not invite editing.\n", "\n", "A **tuple** is a list's stricter cousin: ordered, indexable, and **immutable** โ€” once built, it cannot be changed. That is not a limitation; it is a promise. When you see a tuple, you know the shape is fixed.\n", "\n", "**Writing and unpacking a tuple.** A tuple looks like a list but uses **round brackets**, and you can **unpack** it into several variables in one line:\n", "\n", "```python\n", "my_tuple = (value0, value1, value2) # round brackets make a tuple\n", "a, b, c = my_tuple # unpacking: a=value0, b=value1, c=value2\n", "my_tuple[0] # you can still read by index, like a list\n", "```\n", "\n", "The one thing you *cannot* do is `my_tuple[0] = ...` โ€” a tuple flatly refuses to change." ] }, { "cell_type": "markdown", "id": "13f363b6", "metadata": {}, "source": [ "### ๐Ÿ”ฎ Predict Before You Run\n", "\n", "In the next cell, `client` is a tuple of four items in the order **(name, height_cm, costume, deposit)**. After unpacking, what will the two `print` lines show? Predict, then run." ] }, { "cell_type": "code", "execution_count": 9, "id": "4fa8a9c0", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.686287Z", "iopub.status.busy": "2026-06-02T14:23:51.685391Z", "iopub.status.idle": "2026-06-02T14:23:51.694861Z", "shell.execute_reply": "2026-06-02T14:23:51.693052Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Jonathan Harker is 178 cm tall.\n", "Costume: Dashing Vampire Hunter โ€” deposit: 50 pounds.\n" ] } ], "source": [ "# โฌ‡๏ธ CHANGE THESE FIELDS, THEN RE-RUN\n", "client = (\"Jonathan Harker\", 178, \"Dashing Vampire Hunter\", 50)\n", "# ----------------------------------\n", "\n", "name, height_cm, costume, deposit = client # unpacking\n", "\n", "print(name, \"is\", height_cm, \"cm tall.\")\n", "print(\"Costume:\", costume, \"โ€” deposit:\", deposit, \"pounds.\")" ] }, { "cell_type": "markdown", "id": "edcfcd9b", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- Round brackets `( )` and commas make a tuple. The four fields are positional: position 0 is the name, position 3 is the deposit โ€” always, no exceptions.\n", "- `name, height_cm, costume, deposit = client` is **tuple unpacking**: Python hands the four positions to four variables in one line. This is the cleanest way to read a fixed-shape record.\n", "- Try `client[2] = \"Werewolf\"`. Python will refuse. That refusal is the whole point โ€” Dr. Frankenstein does not want her fitting records mutating on their own (she has had quite enough of that)." ] }, { "cell_type": "markdown", "id": "bfaa7e53", "metadata": {}, "source": [ "### Returning Two Things at Once\n", "\n", "A function can only return one value โ€” but that one value can be a tuple, which is how Python returns \"two things\" without fuss. Dr. Frankenstein asks her deposit-checking function for **both** the verdict and a reason.\n", "\n", "**Returning a tuple, unpacking the result.** Build the tuple on the `return` line, then unpack it where you call the function:\n", "\n", "```python\n", "return (first_thing, second_thing) # one tuple, two pieces inside\n", "x, y = some_function() # unpack the returned tuple into two names\n", "```" ] }, { "cell_type": "code", "execution_count": 10, "id": "c5b9917e", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.700185Z", "iopub.status.busy": "2026-06-02T14:23:51.699725Z", "iopub.status.idle": "2026-06-02T14:23:51.709073Z", "shell.execute_reply": "2026-06-02T14:23:51.707328Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Verdict: approved\n", "Reason : deposit meets the threshold\n" ] } ], "source": [ "def check_deposit(deposit):\n", " if deposit >= 25:\n", " return (\"approved\", \"deposit meets the threshold\")\n", " else:\n", " return (\"declined\", \"deposit below threshold\")\n", "\n", "verdict, reason = check_deposit(50)\n", "print(\"Verdict:\", verdict)\n", "print(\"Reason :\", reason)" ] }, { "cell_type": "markdown", "id": "aa04ff88", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- The function returns **one tuple** containing two strings. Python lets us pretend it returned two things by unpacking on the receiving line.\n", "- This pattern โ€” verdict + reason, value + error, x + y โ€” is how nearly all multi-return Python is written. You will see it again in every later notebook.\n", "\n", "**Takeaway:** use a tuple when the record has a **fixed shape** and shouldn't be edited after it's built. Use a list when the contents will grow, shrink, or be rewritten." ] }, { "cell_type": "markdown", "id": "eb7bacd0", "metadata": {}, "source": [ "### โœ๏ธ Your Turn โ€” Frankenstein's Records\n", "\n", "Dr. Frankenstein keeps each client as a tuple `(name, height_cm, costume, deposit)`. A client is **approved** when their deposit is **โ‰ฅ 25**.\n", "\n", "Loop over the `clients` list below. For each one, **unpack** the tuple into four variables, then print the client's name and whether they are `\"approved\"` or `\"declined\"`. Keep a running count of how many were approved, and print that total at the end." ] }, { "cell_type": "code", "execution_count": 11, "id": "da9a9468", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "clients = [\n", " (\"Jonathan Harker\", 178, \"Vampire Hunter\", 50),\n", " (\"Lucy Westenra\", 165, \"Sleepwalking Bride\", 20),\n", " (\"Van Helsing\", 170, \"Mad Professor\", 80),\n", " (\"Renfield\", 160, \"Very Large Moth\", 15),\n", "]\n", "\n", "approved_count = 0\n", "# TODO: loop over clients; unpack each tuple into name, height_cm, costume, deposit\n", "# TODO: print the name and \"approved\" (deposit >= 25) or \"declined\"\n", "# TODO: add 1 to approved_count each time someone is approved\n", "# TODO: after the loop, print how many were approved" ] }, { "cell_type": "markdown", "id": "07d86d4a", "metadata": {}, "source": [ "## Dictionaries: Look It Up by Name\n", "\n", "**The Phantom** runs Masks & Millinery (she keeps half her own face theatrically hidden, purely for the brand). Her counter carries a dozen mask styles, and at any moment a customer may ask the price of one. The Phantom used to scan a printed list by candlelight. Now she asks Python.\n", "\n", "A **dictionary** stores **keyโ€“value pairs**. Give it the key, and it hands back the value in a single step โ€” no scanning, no counting positions, no order to remember.\n", "\n", "**Writing a dictionary, looking one up.** A dictionary uses **curly braces** holding `key: value` pairs, and you look a value up by putting its key in **square brackets**:\n", "\n", "```python\n", "my_dict = {key1: value1, key2: value2} # braces, with a colon between key and value\n", "my_dict[key1] # hand it a key, get that key's value back\n", "```\n", "\n", "The key goes in square brackets the way an index does โ€” but it's a *label* you chose, not a numbered position." ] }, { "cell_type": "code", "execution_count": 12, "id": "3cd33173", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.714888Z", "iopub.status.busy": "2026-06-02T14:23:51.714280Z", "iopub.status.idle": "2026-06-02T14:23:51.723667Z", "shell.execute_reply": "2026-06-02T14:23:51.721647Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A domino mask costs: 5.0\n" ] } ], "source": [ "# โฌ‡๏ธ CHANGE THESE PRICES, THEN RE-RUN\n", "masks = {\n", " \"half-mask, white\": 12.00,\n", " \"domino mask\": 5.00,\n", " \"plague doctor beak\": 18.00,\n", " \"golden opera mask\": 30.00,\n", "}\n", "# ----------------------------------\n", "\n", "print(\"A domino mask costs:\", masks[\"domino mask\"])" ] }, { "cell_type": "markdown", "id": "17e0c669", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- The curly braces `{ }` and the colons mark a **dictionary**.\n", "- The string on the left of each colon is a **key**; the number on the right is its **value**.\n", "- `masks[\"domino mask\"]` is a **key lookup**. Python goes straight to that entry. It does *not* walk through the others first." ] }, { "cell_type": "code", "execution_count": 13, "id": "48e31d19", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "k0\n", "\n", "half-mask, white\n", "\n", "\n", "\n", "v0\n", "\n", "ยฃ12.00\n", "\n", "\n", "\n", "k0->v0\n", "\n", "\n", "look up\n", "\n", "\n", "\n", "k1\n", "\n", "domino mask\n", "\n", "\n", "\n", "v1\n", "\n", "ยฃ5.00\n", "\n", "\n", "\n", "k1->v1\n", "\n", "\n", "look up\n", "\n", "\n", "\n", "k2\n", "\n", "plague doctor beak\n", "\n", "\n", "\n", "v2\n", "\n", "ยฃ18.00\n", "\n", "\n", "\n", "k2->v2\n", "\n", "\n", "look up\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š A dictionary maps each key to a value (click to show code)\n", "from graphviz import Digraph\n", "\n", "d = Digraph(graph_attr={\"rankdir\": \"LR\"})\n", "pairs = [(\"half-mask, white\", \"ยฃ12.00\"),\n", " (\"domino mask\", \"ยฃ5.00\"),\n", " (\"plague doctor beak\", \"ยฃ18.00\")]\n", "for i, (key, value) in enumerate(pairs):\n", " d.node(f\"k{i}\", key, shape=\"box\", style=\"filled\", fillcolor=\"lightyellow\")\n", " d.node(f\"v{i}\", value, shape=\"box\", style=\"filled\", fillcolor=\"lightblue\")\n", " d.edge(f\"k{i}\", f\"v{i}\", label=\"look up\")\n", "d" ] }, { "cell_type": "markdown", "id": "8eea8a57", "metadata": {}, "source": [ "### Adding, Updating, and Checking First\n", "\n", "The Phantom adds a new style and corrects a price using the same `key = value` syntax. She also checks whether something is on the counter *before* trying to read it โ€” looking up a key that isn't there is an error.\n", "\n", "**Assigning and testing membership.** One form both adds and updates; `in` asks whether a key is present:\n", "\n", "```python\n", "my_dict[key] = value # adds the key if it's new, overwrites it if it already exists\n", "if key in my_dict: # a True/False test โ€” is this key present?\n", " ...\n", "```" ] }, { "cell_type": "code", "execution_count": 14, "id": "0e20a2b3", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.730912Z", "iopub.status.busy": "2026-06-02T14:23:51.729898Z", "iopub.status.idle": "2026-06-02T14:23:51.739516Z", "shell.execute_reply": "2026-06-02T14:23:51.737521Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Half-mask, white: 12.0\n", "No plain paper masks โ€” the Phantom would never.\n" ] } ], "source": [ "masks[\"cat mask, sequined\"] = 9.00 # add a new key\n", "masks[\"domino mask\"] = 6.00 # update an existing one\n", "\n", "if \"half-mask, white\" in masks:\n", " print(\"Half-mask, white:\", masks[\"half-mask, white\"])\n", "\n", "if \"plain paper mask\" not in masks:\n", " print(\"No plain paper masks โ€” the Phantom would never.\")" ] }, { "cell_type": "markdown", "id": "ab3de6e8", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- Assigning to a new key **adds** it. Assigning to an existing key **overwrites** it. Same syntax, two outcomes โ€” Python picks based on whether the key already exists.\n", "- `key in some_dict` returns `True` or `False`. Use it whenever you aren't certain the key is there." ] }, { "cell_type": "markdown", "id": "89d45ecd", "metadata": {}, "source": [ "### Safer Lookup: `.get()`\n", "\n", "`masks[\"unicorn horn\"]` crashes when no unicorn horn is on the counter. Often that is what the Phantom wants โ€” but sometimes \"missing\" should quietly mean *zero* or *not available*. The `.get()` method gives her that option." ] }, { "cell_type": "code", "execution_count": 15, "id": "00fc462e", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.746534Z", "iopub.status.busy": "2026-06-02T14:23:51.745889Z", "iopub.status.idle": "2026-06-02T14:23:51.754800Z", "shell.execute_reply": "2026-06-02T14:23:51.752725Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6.0\n", "None\n", "0.0\n" ] } ], "source": [ "print(masks.get(\"domino mask\")) # found โ†’ returns 6.00\n", "print(masks.get(\"unicorn horn\")) # missing โ†’ returns None\n", "print(masks.get(\"unicorn horn\", 0.00)) # missing โ†’ returns the default we supply" ] }, { "cell_type": "markdown", "id": "45f8ce29", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `d.get(key)` returns the value if the key exists, and **`None`** if it doesn't โ€” *without* crashing. (`None` is Python's \"nothing here\" value.)\n", "- `d.get(key, default)` returns *your* chosen default instead of `None`. The Phantom uses `0.00` when missing means \"not for sale tonight.\"\n", "- **Rule of thumb:** use `.get()` when missing is a normal possibility. Use `d[key]` when missing should be a loud bug." ] }, { "cell_type": "markdown", "id": "6c0447f5", "metadata": {}, "source": [ "### Walking the Whole Counter\n", "\n", "Sometimes the Phantom does want every item โ€” for example, to print the whole price list. The `.items()` view yields each key and its value together.\n", "\n", "**Looping over keyโ€“value pairs.** Use `.items()` with two loop variables โ€” one for the key, one for the value:\n", "\n", "```python\n", "for key, value in my_dict.items(): # one pair handed over per pass of the loop\n", " ...\n", "```" ] }, { "cell_type": "code", "execution_count": 16, "id": "59b70569", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.760304Z", "iopub.status.busy": "2026-06-02T14:23:51.759701Z", "iopub.status.idle": "2026-06-02T14:23:51.768288Z", "shell.execute_reply": "2026-06-02T14:23:51.765995Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "half-mask, white ยฃ12.00\n", "domino mask ยฃ6.00\n", "plague doctor beak ยฃ18.00\n", "golden opera mask ยฃ30.00\n", "cat mask, sequined ยฃ9.00\n" ] } ], "source": [ "for item, price in masks.items():\n", " print(f\"{item:<22} ยฃ{price:.2f}\")" ] }, { "cell_type": "markdown", "id": "6b21a4d4", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `masks.items()` yields one `(key, value)` tuple per entry โ€” note the tuples from the last section, quietly working underneath.\n", "- The two variables `item, price` are tuple-unpacked on every pass of the loop. This is the standard way to iterate a dictionary." ] }, { "cell_type": "markdown", "id": "6a08cb94", "metadata": {}, "source": [ "### Sorting the Counter\n", "\n", "The Phantom likes to print her price list in a tidy order โ€” the mask names alphabetically, or the prices from low to high. The built-in `sorted()` does this. It hands back a **brand-new sorted list** and leaves the original untouched.\n", "\n", "**How `sorted()` reads.** Give it a sequence; add `reverse=True` to flip the direction:\n", "\n", "```python\n", "sorted(sequence) # smallest โ†’ largest (A โ†’ Z for words)\n", "sorted(sequence, reverse=True) # largest โ†’ smallest (Z โ†’ A)\n", "```\n", "\n", "A dictionary plugs straight in: `sorted(masks)` sorts the **keys**, and `sorted(masks.values())` sorts the **values**." ] }, { "cell_type": "code", "execution_count": 17, "id": "bc37963e", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.774567Z", "iopub.status.busy": "2026-06-02T14:23:51.773924Z", "iopub.status.idle": "2026-06-02T14:23:51.784731Z", "shell.execute_reply": "2026-06-02T14:23:51.782390Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Names Aโ†’Z : ['cat mask, sequined', 'domino mask', 'golden opera mask', 'half-mask, white', 'plague doctor beak']\n", "Prices lowโ†’high: [6.0, 9.0, 12.0, 18.0, 30.0]\n", "Prices highโ†’low: [30.0, 18.0, 12.0, 9.0, 6.0]\n" ] } ], "source": [ "print(\"Names Aโ†’Z :\", sorted(masks)) # sort the keys\n", "print(\"Prices lowโ†’high:\", sorted(masks.values())) # sort the values\n", "print(\"Prices highโ†’low:\", sorted(masks.values(), reverse=True))" ] }, { "cell_type": "markdown", "id": "2fc23d21", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `sorted(some_sequence)` returns a **new** sorted list. The original dictionary is untouched. (There is also `list.sort()`, which sorts a list **in place** and returns nothing.)\n", "- `sorted(masks)` sorts the **keys** (the mask names); `sorted(masks.values())` sorts the **values** (the prices).\n", "- `reverse=True` flips the order, so the most expensive mask comes first.\n", "\n", "**Takeaway:** reach for a dictionary when you want to **look something up by name** โ€” by a product, a person, an ID. Lists are for *positions*; dictionaries are for *labels*." ] }, { "cell_type": "markdown", "id": "cf8482c4", "metadata": {}, "source": [ "### ๐Ÿ”ญ Going Further (optional): sorting by value, *with names attached*\n", "\n", "`sorted(masks.values())` gives you the prices but loses track of *which mask* each belongs to. To sort the whole `name โ†’ price` pairs by price, Python programmers reach for a tiny helper called a **lambda** โ€” a one-line, throwaway function:\n", "\n", "```python\n", "priciest = sorted(masks.items(), key=lambda pair: pair[1], reverse=True)\n", "```\n", "\n", "Read `key=lambda pair: pair[1]` as: *\"for each `(name, price)` pair, sort using `pair[1]` โ€” the price.\"*\n", "\n", "This is genuinely a step beyond where we are now, so **you will not be asked to write lambdas in this notebook.** It's here only so the syntax isn't a total stranger when you meet it later. If it looks cryptic, that's fine โ€” move on." ] }, { "cell_type": "markdown", "id": "bb7e8c0a", "metadata": {}, "source": [ "### ๐Ÿ“‹ Dictionary Methods Cheatsheet\n", "\n", "| Method | What it does |\n", "|---|---|\n", "| `d[key]` | Look up (errors if missing) |\n", "| `d.get(key, default)` | Look up with a fallback โ€” never crashes |\n", "| `d[key] = v` | Add a new key or overwrite an existing one |\n", "| `d.pop(key)` | Remove and return the value |\n", "| `d.items()` โ€ข `d.keys()` โ€ข `d.values()` | The three views you can iterate |\n", "| `key in d` | Membership test (fast) |\n", "| `sorted(d)` โ€ข `sorted(d.values())` | A new sorted list of the keys โ€ข of the values |" ] }, { "cell_type": "markdown", "id": "fcdeeaa6", "metadata": {}, "source": [ "### โœ๏ธ Your Turn โ€” The Phantom's Price List\n", "\n", "Start from the Phantom's mask prices below. (1) **Add** a new mask of your own with a price. (2) **Update** `\"domino mask\"` to `6.50`. (3) Use `.get()` on a mask that **isn't** there and print the result (it should be `None`, not a crash). (4) Loop `.items()` and print each `name: price`." ] }, { "cell_type": "code", "execution_count": 18, "id": "cd3695c4", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "# โฌ‡๏ธ CHANGE THESE, THEN RE-RUN\n", "masks = {\n", " \"half-mask, white\": 12.00,\n", " \"domino mask\": 5.00,\n", " \"plague doctor beak\": 18.00,\n", "}\n", "# ----------------------------------\n", "\n", "# TODO 1: add a new mask of your own with a price\n", "# TODO 2: update \"domino mask\" to 6.50\n", "# TODO 3: print masks.get(...) for a mask that is NOT there\n", "# TODO 4: loop masks.items() and print each \"name: price\"" ] }, { "cell_type": "markdown", "id": "efaf71ac", "metadata": {}, "source": [ "## Sets: Membership, Overlap, Uniqueness\n", "\n", "**Camilla** organises the shop's famous masquerade balls (she is charming, a little clingy, and never photographs well). Tonight she has two guest lists โ€” the Friday ball and the Saturday ball โ€” and one urgent question from the caterer: **which guests are coming to *both*?**\n", "\n", "A **set** is a collection with two strict rules: **no duplicates**, and **no order**. What sets are extraordinarily good at is comparing memberships โ€” who's in A, who's in B, who's in both, who's only in one.\n", "\n", "**Writing a set, and the four comparison operators.** A set uses **curly braces** like a dictionary, but with **no colons** โ€” just values. Four operators compare two sets:\n", "\n", "```python\n", "my_set = {a, b, c} # braces, no colons; any repeats are silently dropped\n", "\n", "A & B # intersection โ€” items in BOTH\n", "A | B # union โ€” items in EITHER\n", "A - B # difference โ€” items in A but not B\n", "A ^ B # symmetric difference โ€” items in exactly ONE\n", "```" ] }, { "cell_type": "code", "execution_count": 19, "id": "e5650e33", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.790810Z", "iopub.status.busy": "2026-06-02T14:23:51.789980Z", "iopub.status.idle": "2026-06-02T14:23:51.800885Z", "shell.execute_reply": "2026-06-02T14:23:51.799117Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "At both balls : {'Hyde', 'Cthulhu'}\n", "At either ball : {'Mina', 'The Phantom', 'Dracula', 'Hyde', 'Frankenstein', 'Renfield', 'Cthulhu'}\n", "Friday only : {'Mina', 'Renfield', 'Dracula'}\n", "Exactly one : {'Mina', 'Dracula', 'Frankenstein', 'Renfield', 'The Phantom'}\n" ] } ], "source": [ "# โฌ‡๏ธ CHANGE THESE GUEST LISTS, THEN RE-RUN\n", "friday = {\"Dracula\", \"Hyde\", \"Cthulhu\", \"Mina\", \"Renfield\"}\n", "saturday = {\"Hyde\", \"Cthulhu\", \"Frankenstein\", \"The Phantom\"}\n", "# ----------------------------------\n", "\n", "print(\"At both balls :\", friday & saturday) # intersection\n", "print(\"At either ball :\", friday | saturday) # union\n", "print(\"Friday only :\", friday - saturday) # difference\n", "print(\"Exactly one :\", friday ^ saturday) # symmetric difference" ] }, { "cell_type": "markdown", "id": "a8afe0ab", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- Curly braces with **no colons** make a set, not a dictionary. (An empty set is `set()`; `{}` is an empty dict โ€” Python's one truly awkward corner.)\n", "- `&` is **intersection** (in both), `|` is **union** (in either), `-` is **difference** (in the first but not the second), `^` is **symmetric difference** (in exactly one).\n", "- Camilla's answer to the caterer is one line: `friday & saturday`." ] }, { "cell_type": "code", "execution_count": 20, "id": "796c5288", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 288, "width": 465 } }, "output_type": "display_data" } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Set operations as a Venn diagram (click to show code)\n", "import matplotlib.pyplot as plt\n", "from matplotlib.patches import Circle\n", "\n", "fig, ax = plt.subplots(figsize=(6, 3.4))\n", "ax.add_patch(Circle((0.38, 0.5), 0.30, alpha=0.45, color=\"#7aa6ff\"))\n", "ax.add_patch(Circle((0.62, 0.5), 0.30, alpha=0.45, color=\"#ff9e7a\"))\n", "\n", "ax.text(0.38, 0.86, \"Friday\", ha=\"center\", weight=\"bold\")\n", "ax.text(0.62, 0.86, \"Saturday\", ha=\"center\", weight=\"bold\")\n", "ax.text(0.22, 0.5, \"friday - saturday\\n(Friday only)\", ha=\"center\", va=\"center\", fontsize=9)\n", "ax.text(0.78, 0.5, \"saturday - friday\\n(Saturday only)\", ha=\"center\", va=\"center\", fontsize=9)\n", "ax.text(0.50, 0.5, \"friday & saturday\\n(both)\", ha=\"center\", va=\"center\", fontsize=9)\n", "\n", "ax.set_title(\"friday | saturday is everything inside either circle\", fontsize=10)\n", "ax.set_xlim(0, 1); ax.set_ylim(0.1, 1); ax.axis(\"off\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "eeca10c8", "metadata": {}, "source": [ "### ๐Ÿ”ฎ Predict Before You Run\n", "\n", "The next cell builds a set from a messy guest list with six entries โ€” but only four distinct names. **Predict** two things before you run it: (1) what will `len(guests_unique)` print? (2) Will the unique guests print in the same order as the original list, or not?" ] }, { "cell_type": "code", "execution_count": 21, "id": "bbcea74e", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.806854Z", "iopub.status.busy": "2026-06-02T14:23:51.805924Z", "iopub.status.idle": "2026-06-02T14:23:51.815825Z", "shell.execute_reply": "2026-06-02T14:23:51.813810Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original : ['Dracula', 'Mina', 'Dracula', 'Renfield', 'Mina', 'Hyde']\n", "Unique : {'Mina', 'Renfield', 'Dracula', 'Hyde'}\n", "How many distinct guests? 4\n" ] } ], "source": [ "guests_messy = [\"Dracula\", \"Mina\", \"Dracula\", \"Renfield\", \"Mina\", \"Hyde\"]\n", "guests_unique = set(guests_messy)\n", "\n", "print(\"Original :\", guests_messy)\n", "print(\"Unique :\", guests_unique)\n", "print(\"How many distinct guests?\", len(guests_unique))" ] }, { "cell_type": "markdown", "id": "29f3efb3", "metadata": {}, "source": [ "### ๐Ÿ“‹ Set Methods Cheatsheet\n", "\n", "| Method / operator | What it does |\n", "|---|---|\n", "| `s.add(x)` | Add `x` (no-op if already in) |\n", "| `s.discard(x)` | Remove `x` (no error if absent) |\n", "| `a & b` | Intersection โ€” items in **both** |\n", "| a | b | Union โ€” items in **either** |\n", "| `a - b` | Difference โ€” in the first but not the second |\n", "| `a ^ b` | Symmetric difference โ€” in exactly **one** |\n", "| `x in s` | Membership test (fast) |\n", "| `len(s)` | How many distinct items |" ] }, { "cell_type": "markdown", "id": "3bf083cb", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `set(some_list)` builds a set from any sequence and drops every repeat.\n", "- The result has **no defined order** โ€” Python may print the names in any order. If Camilla wants a sorted list back, she calls `sorted(guests_unique)`.\n", "- Membership in a set is also a single-step check: `\"Dracula\" in guests_unique` is fast no matter how large the set grows.\n", "\n", "**Takeaway:** use a set when you care about **whether things are present**, not where. Use it when you need **uniqueness**." ] }, { "cell_type": "markdown", "id": "d71f499a", "metadata": {}, "source": [ "### โœ๏ธ Your Turn โ€” Camilla's Guest Overlap\n", "\n", "Two masquerade balls, two guest lists:\n", "\n", "```python\n", "friday = {\"Dracula\", \"Mina\", \"Hyde\", \"Cthulhu\", \"Renfield\", \"Van Helsing\"}\n", "saturday = {\"Mina\", \"Van Helsing\", \"The Phantom\", \"Lucy\", \"Dracula\"}\n", "```\n", "\n", "Using **set operators only** (no loops), print: (1) guests at **both** balls, (2) guests at **exactly one** ball, (3) the **number of distinct** guests across both." ] }, { "cell_type": "code", "execution_count": 22, "id": "04618415", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "friday = {\"Dracula\", \"Mina\", \"Hyde\", \"Cthulhu\", \"Renfield\", \"Van Helsing\"}\n", "saturday = {\"Mina\", \"Van Helsing\", \"The Phantom\", \"Lucy\", \"Dracula\"}\n", "\n", "# TODO 1: guests at BOTH balls (intersection)\n", "# TODO 2: guests at EXACTLY ONE ball (symmetric difference)\n", "# TODO 3: number of DISTINCT guests (union, then len)" ] }, { "cell_type": "markdown", "id": "39b1a1f8", "metadata": {}, "source": [ "### Choosing Your Collection โ€” A Quick Guide\n", "\n", "Four collections, four jobs. If you remember nothing else from this notebook, remember this table.\n", "\n", "| If the job needsโ€ฆ | โ€ฆreach for | Example from this notebook |\n", "|---|---|---|\n", "| Order *and* the ability to add / remove / edit | **list** | Dracula's nightly orders |\n", "| A fixed-shape record that shouldn't change | **tuple** | Frankenstein's client `(name, height_cm, costume, deposit)` |\n", "| Looking up a value by a label / name / ID | **dict** | The Phantom's masks (style โ†’ price) |\n", "| Membership / uniqueness / overlap | **set** | Camilla's \"at both balls\" question |\n", "\n", "If you find yourself writing a `for` loop just to check whether something is in a list, that's a **set** screaming. If you keep using `if` to find a price, that's a **dict**." ] }, { "cell_type": "markdown", "id": "55b4cf0e", "metadata": {}, "source": [ "### ๐Ÿ’ญ Think About It โ€” The Right Tool for the Job\n", "\n", "You've now met lists, tuples, dictionaries, and sets โ€” each good at different things.\n", "\n", "- Picking the wrong collection still \"works,\" but it can make a program slow or clumsy. Where in everyday life does using the wrong-but-workable tool cause similar friction?\n", "- A dictionary trades extra memory for fast lookup by name. Why is \"use more of one resource to save another\" such a common bargain โ€” and where else do you make that trade?\n", "- Without using any code, how would you explain to a friend the difference between a list and a set, using only an everyday example?\n", "\n", "There are no single right answers here โ€” share a sentence or two on each." ] }, { "cell_type": "markdown", "id": "cbc7318f", "metadata": {}, "source": [ "## Nested Collections: Real Data Has Shape\n", "\n", "So far each example has been **flat** โ€” one list, or one dictionary, or one set. Real data is almost never that simple. Camilla finalises tonight's ball, and every guest has a **name**, an **age**, *and* a **costume**. That is three facts per guest โ€” one row, three columns.\n", "\n", "The standard Python answer is a **list of dictionaries**: a list (one entry per guest) where each entry is a dict (one key per fact). This is exactly the shape of nearly every API response, every spreadsheet row, every database query you will meet in NB09 and NB10.\n", "\n", "**The shape, and reading into it.** Square brackets hold several `{ }` records, and you read into it in **two steps** โ€” list index first, then dict key:\n", "\n", "```python\n", "data = [\n", " {\"key1\": value, \"key2\": value}, # one record (a dict)\n", " {\"key1\": value, \"key2\": value}, # another record\n", "]\n", "data[0] # step one: the whole first record (a dict)\n", "data[0][\"key1\"] # step two: one field inside that record\n", "```" ] }, { "cell_type": "code", "execution_count": 23, "id": "42a2272f", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.821936Z", "iopub.status.busy": "2026-06-02T14:23:51.821301Z", "iopub.status.idle": "2026-06-02T14:23:51.833440Z", "shell.execute_reply": "2026-06-02T14:23:51.830929Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'name': 'Dracula', 'age': 587, 'costume': 'himself, ironically'}\n", "Dracula\n" ] } ], "source": [ "ball = [\n", " {\"name\": \"Dracula\", \"age\": 587, \"costume\": \"himself, ironically\"},\n", " {\"name\": \"Mina\", \"age\": 24, \"costume\": \"Victorian ghost\"},\n", " {\"name\": \"Hyde\", \"age\": 40, \"costume\": \"respectable gentleman\"},\n", " {\"name\": \"Renfield\", \"age\": 51, \"costume\": \"very large moth\"},\n", "]\n", "\n", "print(ball[0]) # a whole guest record\n", "print(ball[0][\"name\"]) # one field of one guest" ] }, { "cell_type": "markdown", "id": "0961f9a5", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- `ball` is a list. Each item in that list is a dictionary.\n", "- `ball[0]` returns the *whole first guest* โ€” a dictionary. To drill into one field, you index **again**: `ball[0][\"name\"]`.\n", "- This double-step โ€” *list index, then dict key* โ€” is the rhythm of working with nested data. Get used to it; it is everywhere." ] }, { "cell_type": "markdown", "id": "38d54aba", "metadata": {}, "source": [ "### Walking and Filtering the Ball\n", "\n", "A `for` loop over the list gives Camilla one full guest record at a time. Inside the loop, each `guest` is a dictionary โ€” so guest fields use the dict syntax `guest[\"name\"]`." ] }, { "cell_type": "code", "execution_count": 24, "id": "c0727ae1", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.838603Z", "iopub.status.busy": "2026-06-02T14:23:51.838067Z", "iopub.status.idle": "2026-06-02T14:23:51.849256Z", "shell.execute_reply": "2026-06-02T14:23:51.845946Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dracula (age 587) โ€” himself, ironically\n", "Mina (age 24) โ€” Victorian ghost\n", "Hyde (age 40) โ€” respectable gentleman\n", "Renfield (age 51) โ€” very large moth\n", "\n", "Ghosts: ['Mina']\n" ] } ], "source": [ "for guest in ball:\n", " print(f\"{guest['name']:<10} (age {guest['age']:>3}) โ€” {guest['costume']}\")\n", "\n", "# Filter: who came as a ghost? Build a new list with a loop.\n", "ghosts = []\n", "for guest in ball:\n", " if \"ghost\" in guest[\"costume\"]:\n", " ghosts.append(guest[\"name\"])\n", "\n", "print()\n", "print(\"Ghosts:\", ghosts)" ] }, { "cell_type": "markdown", "id": "a13d6b01", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- Inside the loop, `guest` is one whole dictionary. We pull each field with `guest[\"age\"]`, `guest[\"costume\"]`, etc.\n", "- The **filter** is just a `for` loop with an `if` inside: walk every guest, and `append` the name only when the costume mentions a ghost. That \"start an empty list, loop, append when a test passes\" pattern is worth memorising โ€” it shows up constantly.\n", "- Later in this notebook you'll meet **comprehensions**, a one-line shorthand for exactly this pattern.\n", "\n", "**Takeaway:** flat collections are the stepping stones. **Lists of dicts** are the workhorse shape for real data. When NB09 returns rows from a database and NB10 returns JSON from an API, this is what they will look like." ] }, { "cell_type": "markdown", "id": "9cbe2d7a", "metadata": {}, "source": [ "### โœ๏ธ Your Turn โ€” Filter the Ball\n", "\n", "Using the `ball` guest list from above (a list of dicts), collect the **names** of every guest **older than 100** and print them. A `for` loop with `append`, or a comprehension โ€” your choice." ] }, { "cell_type": "code", "execution_count": 25, "id": "9a41ae33", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "# Uses the `ball` list of guest dicts from the section above.\n", "\n", "# TODO: collect the names of guests older than 100, then print them.\n", "# elders = []\n", "# for g in ball:\n", "# ..." ] }, { "cell_type": "markdown", "id": "0a09f7eb", "metadata": {}, "source": [ "## Abstract Data Types: The Promise vs. the Storage\n", "\n", "**Mr. Hyde** manages the Fitting Rooms (he is dreadfully impatient, so he is *very* invested in fairness). Customers form a line; he serves them in the order they arrived. His staff don't care *how* the line is stored โ€” paper ledger, whiteboard, app โ€” they only care that the system answers three questions consistently:\n", "\n", "- **add** a customer to the back of the line\n", "- **next customer** โ€” remove and return the one at the front\n", "- **size** โ€” how many are waiting\n", "\n", "That trio is the **interface**: the promise the line makes. Hyde could store the line as a Python list, or as a dictionary keyed by ticket number โ€” the interface stays the same. That separation is what we call an **abstract data type**, or **ADT**.\n", "\n", "> **An ADT is *what* the collection does (its promised operations). Its implementation is *how* it stores the data.**\n", "\n", "The big idea: the rest of your program should only ever rely on the promise. Swap the storage out later and nothing else has to change. A line waited in order โ€” first in, first out โ€” is so common it has a name: a **queue**." ] }, { "cell_type": "markdown", "id": "83bf22fa", "metadata": {}, "source": [ "### The Three Operations, in Pseudocode First\n", "\n", "Before any Python, Hyde writes the three operations of his queue in pseudocode โ€” exactly the workflow from Notebook 3. The storage is just a **list**; each operation is one tiny action on it.\n", "\n", "```text\n", "line โ† empty list\n", "\n", "TO add(name):\n", " APPEND name to the end of line\n", "\n", "TO next_customer():\n", " REMOVE and RETURN the first item of line\n", "\n", "TO size():\n", " RETURN the length of line\n", "```\n", "\n", "Notice none of this says *how* the line has to be a list โ€” that's just the choice Hyde made today. The three promises are what matter. The Python below is the same pseudocode in working code, using the list methods you already know." ] }, { "cell_type": "code", "execution_count": 26, "id": "938356b8", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:51.858582Z", "iopub.status.busy": "2026-06-02T14:23:51.857561Z", "iopub.status.idle": "2026-06-02T14:23:51.873780Z", "shell.execute_reply": "2026-06-02T14:23:51.871180Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Waiting: 3\n", "Now fitting: Dracula\n", "Still waiting: 2\n", "The line now: ['Cthulhu', 'Mina']\n" ] } ], "source": [ "# The queue's storage is just a list. The three promised operations\n", "# are the three list actions shown in the comments.\n", "\n", "line = [] # ON CREATE: an empty list\n", "\n", "line.append(\"Dracula\") # add(name): append to the back\n", "line.append(\"Cthulhu\")\n", "line.append(\"Mina\")\n", "\n", "print(\"Waiting:\", len(line)) # size(): how many are waiting\n", "\n", "served = line.pop(0) # next_customer(): remove + return the FRONT\n", "print(\"Now fitting:\", served)\n", "\n", "print(\"Still waiting:\", len(line))\n", "print(\"The line now:\", line)" ] }, { "cell_type": "markdown", "id": "31390b2f", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- The list `line` is the **implementation** โ€” Hyde's choice of storage.\n", "- `append`, `pop(0)`, and `len` are the three **operations** that fulfil the promise: *add to the back*, *take from the front*, *count*. `line.pop(0)` does two things at once โ€” it removes the first item **and** hands it back to you.\n", "- Because customers join at the back and leave from the front, the first one in is the first one served. That \"first in, first out\" rule is what makes this a **queue**.\n", "- If next week Hyde decided to store the line as a dictionary keyed by ticket number instead, he'd only have to rewrite these three operations โ€” any code that just calls *add*, *next customer*, and *size* would carry on unchanged. **That** is the payoff of separating the promise from the storage." ] }, { "cell_type": "markdown", "id": "5df7de24", "metadata": {}, "source": [ "### Picture It: One Promise, Two Storages\n", "\n", "The diagram below shows the same queue *promise* โ€” add, next_customer, size โ€” sitting above two different storage choices. The point isn't the diagram โ€” it's that the box on top doesn't care which box on the bottom you pick." ] }, { "cell_type": "code", "execution_count": 27, "id": "7c0c79ed", "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2026-06-02T14:23:51.882796Z", "iopub.status.busy": "2026-06-02T14:23:51.882050Z", "iopub.status.idle": "2026-06-02T14:23:52.888691Z", "shell.execute_reply": "2026-06-02T14:23:52.886385Z" }, "jupyter": { "source_hidden": true } }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "I\n", "\n", "Queue (the promise)\n", "add ยท next_customer ยท size\n", "\n", "\n", "\n", "L\n", "\n", "stored as a list\n", "line = []\n", "\n", "\n", "\n", "I->L\n", "\n", "\n", "one option\n", "\n", "\n", "\n", "D\n", "\n", "stored as a dict\n", "line = {ticket: name}\n", "\n", "\n", "\n", "I->D\n", "\n", "\n", "another option\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š ADT interface diagram (click to show code)\n", "from graphviz import Digraph\n", "\n", "d = Digraph(graph_attr={\"rankdir\": \"TB\"})\n", "d.node(\"I\", \"Queue (the promise)\\nadd ยท next_customer ยท size\",\n", " shape=\"box\", style=\"filled,bold\", fillcolor=\"lightyellow\")\n", "d.node(\"L\", \"stored as a list\\nline = []\", shape=\"box\",\n", " style=\"filled,dashed\", fillcolor=\"lightgrey\")\n", "d.node(\"D\", \"stored as a dict\\nline = {ticket: name}\", shape=\"box\",\n", " style=\"filled,dashed\", fillcolor=\"lightgrey\")\n", "d.edge(\"I\", \"L\", label=\"one option\")\n", "d.edge(\"I\", \"D\", label=\"another option\")\n", "d" ] }, { "cell_type": "markdown", "id": "6e5ab318", "metadata": {}, "source": [ "### ๐Ÿ’ญ Think About It โ€” You Don't Need to Know How It Works\n", "\n", "An abstract data type promises *what* you can do (push, pop, look something up) while hiding *how* it's stored underneath.\n", "\n", "- You use dozens of things daily without knowing how they work inside โ€” a car, a phone, a card payment. Is that a good thing, a risky thing, or both?\n", "- If two different storage methods keep the exact same promise to the user, does it matter which one is used underneath? When would you suddenly start to care?\n", "- Hiding complexity behind a simple interface is one of the biggest ideas in computing. Where have you seen a simple \"front\" hide messy complexity in the non-computing world?\n", "\n", "There are no single right answers here โ€” share a sentence or two on each." ] }, { "cell_type": "markdown", "id": "31aede60", "metadata": {}, "source": [ "**Reading it:** the yellow box is the public promise โ€” the three operation names. The grey boxes are two different ways to keep the data. Code that uses the queue only relies on the yellow box, so changing the grey box is free." ] }, { "cell_type": "markdown", "id": "2bac52ab", "metadata": {}, "source": [ "### โœ๏ธ Your Turn โ€” Hyde's Fitting-Room Queue\n", "\n", "Hyde's queue is a plain list. Start one, then practise all of its operations โ€” plus two new ones the busy evening demands:\n", "\n", "- **peek** โ€” look at the name at the front *without* removing it (that's just `line[0]`).\n", "- **cancel** โ€” a customer leaves the line early (that's `line.remove(name)`).\n", "\n", "In the cell below: (1) start with an empty `line`, (2) **add** Dracula, Cthulhu, and Mina, (3) **peek** at the front and print it, (4) **cancel** Cthulhu, (5) serve the **next customer** with `pop(0)` and print who it was, (6) print how many are still waiting.\n", "\n", "**Think about it (the interface question):** if Hyde swapped the list for a *dictionary keyed by ticket number*, which of these operations โ€” *add*, *next customer*, *size*, *peek*, *cancel* โ€” would he have to rewrite, and which would still \"just work\" for the people calling them? That gap between the **promise** and the **storage** is the whole idea of an ADT." ] }, { "cell_type": "code", "execution_count": 28, "id": "036ebd05", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "# โฌ‡๏ธ EDIT / EXTEND THIS, THEN RE-RUN\n", "line = []\n", "# ----------------------------------\n", "\n", "# TODO 1: add Dracula, Cthulhu, and Mina to the line (line.append(...))\n", "# TODO 2: peek at the front WITHOUT removing it, and print it (line[0])\n", "# TODO 3: cancel Cthulhu (line.remove(\"Cthulhu\"))\n", "# TODO 4: serve the next customer and print who it was (line.pop(0))\n", "# TODO 5: print how many are still waiting (len(line))" ] }, { "cell_type": "markdown", "id": "3cdd526d", "metadata": {}, "source": [ "### A Cleaner Way to Build a Collection: Comprehensions\n", "\n", "**Cthulhu** handles Alterations from the damp room in the basement (the extra tentacles make hemming remarkably quick). He has a list of sleeve measurements and one rule from the master cutter: add 2 cm to every measurement for the seam allowance. He *could* write a loop. He prefers a **list comprehension** โ€” one line that builds a new list from an old one.\n", "\n", "**The comprehension shape.** A comprehension builds a whole list (or dict) in one line. Read it left to right:\n", "\n", "```python\n", "[expression for item in source] # list comprehension\n", "[expression for item in source if condition] # ...the same, but keep only some items\n", "{key: value for item in source} # dict comprehension (note the colon)\n", "```\n", "\n", "The `expression` is what you want *each* output item to be โ€” here, \"the measurement plus 2.\"" ] }, { "cell_type": "code", "execution_count": 29, "id": "94a3816d", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:52.895012Z", "iopub.status.busy": "2026-06-02T14:23:52.894068Z", "iopub.status.idle": "2026-06-02T14:23:52.905356Z", "shell.execute_reply": "2026-06-02T14:23:52.903326Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loop way : [64, 67, 62, 70, 65]\n", "comprehension : [64, 67, 62, 70, 65]\n", "allowance : {'Dracula': 2, 'Mina': 2, 'Hyde': 2}\n" ] } ], "source": [ "sleeves = [62, 65, 60, 68, 63]\n", "\n", "# Old way: loop + append\n", "adjusted_loop = []\n", "for m in sleeves:\n", " adjusted_loop.append(m + 2)\n", "\n", "# Comprehension way: one line, same result\n", "adjusted = [m + 2 for m in sleeves]\n", "\n", "print(\"loop way :\", adjusted_loop)\n", "print(\"comprehension :\", adjusted)\n", "\n", "# A dict comprehension โ€” same idea, but builds key: value pairs.\n", "# Every client gets the same 2 cm seam allowance.\n", "clients = [\"Dracula\", \"Mina\", \"Hyde\"]\n", "allowance = {name: 2 for name in clients}\n", "print(\"allowance :\", allowance)" ] }, { "cell_type": "markdown", "id": "12211aae", "metadata": {}, "source": [ "### Understanding the Code\n", "\n", "- A **list comprehension** has the shape `[expression for item in source]`. Read it left-to-right: *\"build a list of expression, for each item in source.\"* Here the expression is `m + 2`.\n", "- A **dict comprehension** is the same idea with `key: value` on the left and curly braces around the whole thing: `{name: 2 for name in clients}` pairs each client name with `2`.\n", "- Both are exactly equivalent to a loop with `append`/assignment โ€” Cthulhu writes them this way because they read closer to what he means: *\"two more centimetres on everything.\"*\n", "\n", "**Takeaway:** a comprehension is a one-line shorthand for the build-a-collection loop. Reach for it once the loop version feels obvious; until then, the loop is perfectly good." ] }, { "cell_type": "markdown", "id": "59f27b82", "metadata": {}, "source": [ "### โœ๏ธ Your Turn โ€” Adjust Every Sleeve\n", "\n", "Cthulhu's Alterations department adds 2 cm to every sleeve. Given `sleeves = [62, 65, 60, 68, 63]`, use a **list comprehension** to build a new list with each value `+ 2`, and print it.\n", "\n", "**Bonus:** given `clients = [\"Dracula\", \"Mina\", \"Hyde\"]`, use a **dict comprehension** to build `{name: 2 for ...}` โ€” every client mapped to their 2 cm allowance โ€” and print it." ] }, { "cell_type": "code", "execution_count": 30, "id": "d5493e13", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "sleeves = [62, 65, 60, 68, 63]\n", "\n", "# TODO: adjusted = [ ... ] # each sleeve + 2, via a list comprehension\n", "# print(adjusted)\n", "\n", "# Bonus dict comprehension:\n", "# clients = [\"Dracula\", \"Mina\", \"Hyde\"]\n", "# allowance = { ... } # each name mapped to 2\n", "# print(allowance)" ] }, { "cell_type": "markdown", "id": "a62a6232", "metadata": {}, "source": [ "### Why Dictionaries and Sets Look Things Up So Fast\n", "\n", "The Phantom's mask catalogue might run to hundreds of styles on a busy night. When she asks \"what's the price of the plague doctor beak?\", how does Python find it?\n", "\n", "If the catalogue were a **list**, Python would have no choice but to **walk it** โ€” check the first entry, then the next, then the next, until it hits a match. The bigger the list, the longer that walk. A list with ten times the items takes (roughly) ten times as long to search. Think of looking for a friend's name on an unsorted sign-up sheet: you read top to bottom until you spot it.\n", "\n", "A **dictionary** (and a **set**) does something cleverer. It doesn't walk at all โ€” it jumps *straight* to the right spot, and it takes about the same tiny amount of time whether the catalogue holds ten masks or ten thousand. Think of a coat-check: you hand over ticket #47 and the attendant walks directly to slot 47, never glancing at the other coats.\n", "\n", "**The trick is called hashing.** When you store a key like `\"plague doctor beak\"`, Python runs it through a **hash function** โ€” a small recipe that turns the key into a number. That number tells Python *which shelf* to put the value on. Later, when you look the same key up, Python runs the *same* recipe, gets the *same* number, and goes straight to that shelf. No scanning. The key itself tells Python where to look.\n", "\n", "| | Find an item | As the collection growsโ€ฆ |\n", "|---|---|---|\n", "| **list** (`x in lst`) | walk it, entry by entry | gets steadily slower |\n", "| **dict / set** (`x in d`) | hash the key, jump to its shelf | stays about as fast |\n", "\n", "This is exactly why the Phantom keeps her catalogue in a **dict**, not a list โ€” and why you reach for a **set** when all you need is \"have I seen this before?\" It's also a first taste of a question Notebook 7 makes central, under the name **Big O**: *not just \"does this work?\" but \"how does its cost grow as the data gets bigger?\"*\n", "\n", "> **One catch (the price of the trick):** hashing only works on **immutable** keys โ€” strings, numbers, tuples. That's why a list can't be a dictionary key or a set member: if it could change after being filed, Python could no longer find the shelf it filed it on." ] }, { "cell_type": "markdown", "id": "b979f3f5", "metadata": {}, "source": [ "## Methods Cheatsheets โ€” Where to Find Them\n", "\n", "Each collection's method table now lives **right beside the section that teaches it**, so you can grab it in context:\n", "\n", "- **๐Ÿ“‹ List Methods** โ€” at the end of the Lists / aliasing section.\n", "- **๐Ÿ“‹ Dictionary Methods** โ€” at the end of the Dictionaries section.\n", "- **๐Ÿ“‹ Set Methods** โ€” at the end of the Sets section.\n", "\n", "(Tuples have almost no methods of their own โ€” that's rather the point of them.)" ] }, { "cell_type": "markdown", "id": "bd09f09e", "metadata": {}, "source": [ "## Practice: PyQuiz\n", "\n", "More practice โ€” collections edition. This bank exercises every\n", "collection from the notebook: lists, tuples, dicts, and sets. Two\n", "patterns worth keeping in mind:\n", "\n", "```python\n", "# look something up in a dict, defaulting to 0 when the key is missing\n", "price = menu.get(item, 0)\n", "\n", "# count distinct values in a list โ€” convert to set, then take len\n", "distinct = len(set(items))\n", "```\n", "\n", "Run the cell to load the tool.\n" ] }, { "cell_type": "code", "execution_count": 31, "id": "105532ea", "metadata": { "execution": { "iopub.execute_input": "2026-06-02T14:23:58.193161Z", "iopub.status.busy": "2026-06-02T14:23:58.191949Z", "iopub.status.idle": "2026-06-02T14:24:01.068858Z", "shell.execute_reply": "2026-06-02T14:24:01.064850Z" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0bcc675dee3149d8b220afbe36b93f3f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(VBox(children=(IntProgress(value=0, description='Progress:', layout=Layout(width='100%'), max=1โ€ฆ" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", " (function() {\n", " function handler(e) {\n", " if (e.keyCode===9) {\n", " e.preventDefault();\n", " let start=this.selectionStart, end=this.selectionEnd;\n", " this.value=this.value.slice(0,start)+\" \"+this.value.slice(end);\n", " this.selectionStart=this.selectionEnd=start+4;\n", " }\n", " }\n", " function attach() {\n", " document.querySelectorAll('.code-input textarea')\n", " .forEach(function(ta) {\n", " if (!ta._tabHandler) {\n", " ta._tabHandler = true;\n", " ta.addEventListener('keydown', handler, false);\n", " }\n", " });\n", " }\n", " attach();\n", " new MutationObserver(attach)\n", " .observe(document.body, {childList:true, subtree:true});\n", " })();\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# PyQuiz bootstrap โ€” works in Colab or any local Jupyter.\n", "import os, urllib.request\n", "REPO = \"https://raw.githubusercontent.com/brendanpshea/computing_concepts_python/main\"\n", "if not os.path.exists(\"pyquiz.py\"):\n", " urllib.request.urlretrieve(f\"{REPO}/tools/python_code_quiz/pyquiz.py\", \"pyquiz.py\")\n", "\n", "from pyquiz import PracticeTool\n", "practice_tool = PracticeTool(\n", " json_url=f\"{REPO}/tools/python_code_quiz/banks/nb05_collections.json\"\n", ")\n" ] }, { "cell_type": "markdown", "id": "8636a6b2", "metadata": {}, "source": [ "## โœ๏ธ Capstone โ€” Build a Collection Manager (AI-Assisted)\n", "\n", "This is where every collection in the notebook earns its keep. You'll build a small **collection-manager** program โ€” something that grows, gets searched, and reports on itself. The default fits the shop (a catalog of the Midnight Masquerade's costumes), but **pick your own**: a monster-dex, a trading-card binder, a music library, a bookshelf, a Pokรฉdex of your own invention.\n", "\n", "Whatever it is, your program must hold its data in the **right** collections:\n", "\n", "- a **dict** to look something up **by name** (its stats, price, or details),\n", "- a **list** to keep things in order (the order added, your top picks), and\n", "- a **set** to track what's **unique** โ€” what you've already collected, or which tags appear.\n", "\n", "It also needs a **menu loop** (the player chooses *add / find / list / quit* each round โ€” that's Notebook 4) and at least **one function** you wrote (for example, one that adds an item or looks one up).\n", "\n", "**Step 1 โ€” Design it first (before the AI).** In a markdown cell, jot down: your theme, what one *item* is (its name and 2โ€“3 fields), what the menu lets the player do, and what 'done' looks like (collected them all? hit a target?).\n", "\n", "**Step 2 โ€” Turn your design into a prompt.** Fill the blanks and send it to Gemini (or Claude / ChatGPT):\n", "\n", "> *Write a small collection-manager program in Python for Google Colab. Theme: **[your theme]**. Each item has a name and these fields: **[your fields]**. Keep the catalog in a **dictionary** keyed by name, the order added in a **list**, and the set of names collected in a **set**. Show a menu loop with options to add an item, look one up by name, list everything, and quit. Put at least the 'add' and 'look up' logic in their own functions. Keep it short and beginner-readable.*\n", "\n", "**Step 3 โ€” Get the bones working, then test.** Paste it into the cell below and **run it now**. Get the simplest version working first โ€” add one item, look it up, list the catalog โ€” and check it by hand before adding more.\n", "\n", "**Step 4 โ€” Add the bells and whistles.** Once the core runs, add **one or two**, testing after each: sort the list (most expensive first, like the Phantom's masks), report how many *distinct* items you have (that's your set), or a 'find every item with tag X' filter.\n", "\n", "**Step 5 โ€” Test it like Smee.** Try to break it: look up a name that isn't there (does `.get()` save you?), add the same item twice, list an empty catalog. Fix one thing it gets wrong.\n", "\n", "**Step 6 โ€” Reflect.** In a markdown cell, write 2โ€“3 sentences: what did the AI get wrong or what did you improve, and how did you fix it?\n", "\n", "Remember the course rule: *AI is a fast first draft. You verify.*" ] }, { "cell_type": "code", "execution_count": 32, "id": "3bfbc794", "metadata": {}, "outputs": [], "source": [ "#| eval: false\n", "# โœ๏ธ Paste your AI-built collection manager here, then run it and fix what's broken." ] }, { "cell_type": "markdown", "id": "d58fc519", "metadata": {}, "source": [ "## Key Terms\n", "\n", "- **Abstract Data Type (ADT)** โ€” A description of *what* a collection does (its operations and their behaviour) separate from *how* it stores the data.\n", "- **Aliasing** โ€” When two variables point at the same underlying object, so a change made through one is visible through the other.\n", "- **Comprehension** โ€” A compact one-line way to build a new list or dictionary from an existing sequence.\n", "- **Copy** โ€” A new, independent object with the same contents. For a list, `lst.copy()`, `list(lst)`, or `lst[:]`.\n", "- **Default value** โ€” The value returned by `d.get(key, default)` when the key is missing.\n", "- **Dictionary** โ€” A collection of keyโ€“value pairs that supports fast lookup by key. Written with `{key: value, ...}`.\n", "- **Difference (sets)** โ€” The elements in one set but not another. Written `a - b`.\n", "- **Hashing** โ€” Turning a key into a number that tells Python which \"shelf\" to store or find a value on. It is what lets dictionaries and sets look things up without scanning, and why their keys must be immutable.\n", "- **Immutable** โ€” Cannot be changed after it is created. Tuples are immutable; lists are not.\n", "- **Implementation** โ€” The actual storage and code that fulfils an ADT's promise.\n", "- **Index** โ€” The position of an item in an ordered collection. The first index in Python is `0`.\n", "- **Interface** โ€” The operations an ADT promises to support. Other code relies only on the interface.\n", "- **Intersection (sets)** โ€” The elements common to two sets. Written `a & b`.\n", "- **Key** โ€” The label used to look up a value in a dictionary. Must be unique within that dictionary.\n", "- **List** โ€” An ordered, changeable collection of items. Written with `[ ]`.\n", "- **List of dictionaries** โ€” The standard shape for tabular real-world data: one dict per row, one key per column.\n", "- **Mutable** โ€” Can be changed after it is created. Lists, dicts, and sets are mutable.\n", "- **`None`** โ€” Python's built-in \"nothing here\" value. Returned by `d.get(key)` when the key is missing.\n", "- **Queue** โ€” A collection where items are added at the back and removed from the front: first in, first out.\n", "- **Set** โ€” An unordered collection with no duplicates. Written with `{ }` (no colons).\n", "- **Slice** โ€” A sub-range of a list, written `list[start:stop]`, producing a new list.\n", "- **Tuple** โ€” An ordered, **immutable** collection. Written with `( )`.\n", "- **Union (sets)** โ€” All elements that appear in either set. Written `a | b`.\n", "- **Unpacking** โ€” Assigning the contents of a tuple (or list) to several variables in one statement.\n", "- **Value** โ€” The data stored under a key in a dictionary. Any type is allowed." ] }, { "cell_type": "markdown", "id": "d3c37085", "metadata": {}, "source": [ "## Summary\n", "\n", "- **Pick by promise.** Lists are *ordered + changeable*. Tuples are *ordered + fixed*. Dictionaries are *labelled lookup*. Sets are *membership + uniqueness*. The decision table is the cheatsheet.\n", "- **Watch for aliasing.** `b = a` makes a second name for the same list, not a copy. `a.copy()` (or a full slice) is the fix.\n", "- **Real data is nested.** A *list of dictionaries* is the everyday shape โ€” one dict per row, one key per field.\n", "- **Lookup style matters.** Walking a list grows slower as the list grows; a dictionary lookup stays fast. The seed of next-up Big O.\n", "- **ADTs separate promise from storage.** Hide your storage behind methods and the rest of your program survives a redesign.\n", "- **Comprehensions** turn a build-a-collection loop into one readable line." ] }, { "cell_type": "markdown", "id": "ff938ef2", "metadata": {}, "source": [ "## What's Next\n", "\n", "Functions packaged behaviour. Collections packaged data. **Notebook 6** packages them **together** โ€” methods *and* the data they work on, bundled into objects called **classes**. You've already met the idea in spirit: Hyde's queue was a promise (*add, next_customer, size*) sitting on top of a list. Next time we'll wrap exactly that kind of promise *and* its storage into a single object, on purpose." ] }, { "cell_type": "markdown", "id": "15f5ccdd", "metadata": {}, "source": [ "*COMP 1150 โ€” Computer Science Concepts ยท Brendan Shea, PhD*\n", "*Content licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.9" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "08a57b27c6b445a8b79ffa5ec5a420e9": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_7114873097e54ae4881200a8cea7bf31", "IPY_MODEL_94d7bbb596544f40bac8638f99ed49a4", "IPY_MODEL_fa8fdd42fa4d4cd5bb91565fecc40628", "IPY_MODEL_12c99d79d9614e50b7aa262852f950e9", "IPY_MODEL_ced75ab86a6544b69544ba833246e67d", "IPY_MODEL_8258209066e54d349c00f8bca9ede6bb" ], "layout": "IPY_MODEL_689985f6e1884bb497b0879cc1424f4d", "tabbable": null, "tooltip": null } }, "0a800da996ad42dbbf17b1ab1157ea6d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "100%" } }, "0b61c4afeb364badaadf3e68b0ef560b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "description_width": "" } }, "0bcc675dee3149d8b220afbe36b93f3f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_2043c9d06c014a63a73d2543c0a68e26", "IPY_MODEL_08a57b27c6b445a8b79ffa5ec5a420e9" ], "layout": "IPY_MODEL_0a800da996ad42dbbf17b1ab1157ea6d", "tabbable": null, "tooltip": null } }, "0eae7fdc0c474857ad3485d135bf9461": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "12c99d79d9614e50b7aa262852f950e9": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_750872fed1304512aa80fa838415f97a", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "13b612f654ea49dc97ee1017f14af0eb": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "TextareaModel", "state": { "_dom_classes": [ "code-input" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "TextareaModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "TextareaView", "continuous_update": true, "description": "", "description_allow_html": false, "disabled": false, "layout": "IPY_MODEL_df3cbfabbd2541f089c8f426dc8d7d2d", "placeholder": "โ€‹", "rows": null, "style": "IPY_MODEL_951ad56d9d164644995222c4a2d376c5", "tabbable": null, "tooltip": null, "value": "def first_item(items):\n pass" } }, "15e9739910374eeb88606137497b00bd": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1a96e3b247c14fd693bd3c8f83747720": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": null, "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": null, "text_color": null, "text_decoration": null } }, "1e46629030ac48e087ec798f739b4151": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "50%" } }, "1e63673b46ad4eafb05a3c876e210b47": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1f853cf0b27d4f43bfbe3cacac1f897d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2043c9d06c014a63a73d2543c0a68e26": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_8f4aa2018a3b48cb8096f57f948eab43", "IPY_MODEL_762f3cbd7ef649fda92b068032bf835f", "IPY_MODEL_13b612f654ea49dc97ee1017f14af0eb", "IPY_MODEL_4c6686d39a61425eb20ff6f3c627d4e0", "IPY_MODEL_cd5bfe7e1564425d81318de727b9113c" ], "layout": "IPY_MODEL_1e46629030ac48e087ec798f739b4151", "tabbable": null, "tooltip": null } }, "2a9eccb07f1740e3bb2184bd5d3f3f09": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": null, "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": null, "text_color": null, "text_decoration": null } }, "3aea40147cdb45cb8f0fcbfd5d6f50df": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3fb9531c4f7f441c9a471dc45055cae6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "warning", "description": "Retry", "disabled": false, "icon": "refresh", "layout": "IPY_MODEL_15e9739910374eeb88606137497b00bd", "style": "IPY_MODEL_a5c30c566b8e451abe58c69fda71d86a", "tabbable": null, "tooltip": null } }, "4a789174b692414888262bf610586acd": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "info", "description": "Next", "disabled": true, "icon": "arrow-right", "layout": "IPY_MODEL_fb8505087abb4f9983ab7cc153ca3529", "style": "IPY_MODEL_c0b31d2cd0734672b0d79bd0ee9d9e3d", "tabbable": null, "tooltip": null } }, "4c6686d39a61425eb20ff6f3c627d4e0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_4fab9254ae894cf0b44ff76c70b8a12b", "IPY_MODEL_b07dd126626f4f6daf1188e12148ed88", "IPY_MODEL_4a789174b692414888262bf610586acd", "IPY_MODEL_f6a9f10ccd0f4e168e2b39cba8399de7", "IPY_MODEL_a24c0ccbf1e5423b9b4a30184f916447" ], "layout": "IPY_MODEL_95f44ac737b74c5b974fde5538264a7d", "tabbable": null, "tooltip": null } }, "4fab9254ae894cf0b44ff76c70b8a12b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "success", "description": "Run", "disabled": false, "icon": "check", "layout": "IPY_MODEL_c810204b667446268fbec53115fd503d", "style": "IPY_MODEL_ed133772a6ca4521875c1de17bcdd1a6", "tabbable": null, "tooltip": null } }, "5c51c895ae524f89bfbba3d9915e6907": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "689985f6e1884bb497b0879cc1424f4d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "50%" } }, "698c0d7965c9470e9e86286f7c9ffd23": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": null, "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": null, "text_color": null, "text_decoration": null } }, "6a2e255e0cd94898b0c227047273b124": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "info", "description": "Next", "disabled": true, "icon": "arrow-right", "layout": "IPY_MODEL_1e63673b46ad4eafb05a3c876e210b47", "style": "IPY_MODEL_2a9eccb07f1740e3bb2184bd5d3f3f09", "tabbable": null, "tooltip": null } }, "70337fc8dee447d8a985b01a91cc9148": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7114873097e54ae4881200a8cea7bf31": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_789247a4c9a4408e8645cf42554bd99e", "placeholder": "โ€‹", "style": "IPY_MODEL_d7d44f4f5d044617ae44f89a854d2357", "tabbable": null, "tooltip": null, "value": "

Sample Inputs and Outputs

" } }, "729ad17de2274ace97d4a2bb1c44e8a7": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "100%" } }, "73a9c9c9a5134b48a52659839246dbcc": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "750872fed1304512aa80fa838415f97a": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "762f3cbd7ef649fda92b068032bf835f": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_73a9c9c9a5134b48a52659839246dbcc", "msg_id": "", "outputs": [ { "data": { "text/html": "

Question 1/18

Return the first element of the list. first_item(['a','b','c']) โ†’ 'a'.

", "text/plain": "" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "789247a4c9a4408e8645cf42554bd99e": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8258209066e54d349c00f8bca9ede6bb": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_1f853cf0b27d4f43bfbe3cacac1f897d", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "8926e5e2ce264b9e9c00ab58a12b1d98": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8ba75cd2e39c4b2885b83b3536e604c1": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "200px" } }, "8d1366b2f2354c138878e65ab85edc30": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "8f4aa2018a3b48cb8096f57f948eab43": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "IntProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "IntProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "", "description": "Progress:", "description_allow_html": false, "layout": "IPY_MODEL_729ad17de2274ace97d4a2bb1c44e8a7", "max": 18, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_8d1366b2f2354c138878e65ab85edc30", "tabbable": null, "tooltip": null, "value": 0 } }, "94d7bbb596544f40bac8638f99ed49a4": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_a1bab82735624636b012588927efbe8e", "msg_id": "", "outputs": [ { "data": { "text/html": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
InputOutput
[['a', 'b', 'c']]'a'
[[1, 2, 3]]1
[[42]]42
", "text/plain": "" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "951ad56d9d164644995222c4a2d376c5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "TextStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "TextStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "95f44ac737b74c5b974fde5538264a7d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a1bab82735624636b012588927efbe8e": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a24c0ccbf1e5423b9b4a30184f916447": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "DropdownModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "DropdownModel", "_options_labels": [ "Problem 1", "Problem 2", "Problem 3", "Problem 4", "Problem 5", "Problem 6", "Problem 7", "Problem 8", "Problem 9", "Problem 10", "Problem 11", "Problem 12", "Problem 13", "Problem 14", "Problem 15", "Problem 16", "Problem 17", "Problem 18" ], "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "DropdownView", "description": "Skip to:", "description_allow_html": false, "disabled": false, "index": 0, "layout": "IPY_MODEL_8ba75cd2e39c4b2885b83b3536e604c1", "style": "IPY_MODEL_0b61c4afeb364badaadf3e68b0ef560b", "tabbable": null, "tooltip": null } }, "a5c30c566b8e451abe58c69fda71d86a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": null, "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": null, "text_color": null, "text_decoration": null } }, "b07dd126626f4f6daf1188e12148ed88": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "warning", "description": "Retry", "disabled": false, "icon": "refresh", "layout": "IPY_MODEL_70337fc8dee447d8a985b01a91cc9148", "style": "IPY_MODEL_698c0d7965c9470e9e86286f7c9ffd23", "tabbable": null, "tooltip": null } }, "c0b31d2cd0734672b0d79bd0ee9d9e3d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": null, "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": null, "text_color": null, "text_decoration": null } }, "c7921460d9894dc19418ca3d7fd1ae22": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "c810204b667446268fbec53115fd503d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "cd5bfe7e1564425d81318de727b9113c": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_0eae7fdc0c474857ad3485d135bf9461", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "ced75ab86a6544b69544ba833246e67d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_8926e5e2ce264b9e9c00ab58a12b1d98", "placeholder": "โ€‹", "style": "IPY_MODEL_c7921460d9894dc19418ca3d7fd1ae22", "tabbable": null, "tooltip": null, "value": "

Output

" } }, "d7d44f4f5d044617ae44f89a854d2357": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "df3cbfabbd2541f089c8f426dc8d7d2d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": "200px", "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "100%" } }, "ed133772a6ca4521875c1de17bcdd1a6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": null, "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": null, "text_color": null, "text_decoration": null } }, "f407c53ea07b4ea096c7f6f0b918f8eb": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "f6a9f10ccd0f4e168e2b39cba8399de7": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ButtonModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "primary", "description": "Show Hint", "disabled": false, "icon": "lightbulb-o", "layout": "IPY_MODEL_3aea40147cdb45cb8f0fcbfd5d6f50df", "style": "IPY_MODEL_1a96e3b247c14fd693bd3c8f83747720", "tabbable": null, "tooltip": null } }, "fa8fdd42fa4d4cd5bb91565fecc40628": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_5c51c895ae524f89bfbba3d9915e6907", "placeholder": "โ€‹", "style": "IPY_MODEL_f407c53ea07b4ea096c7f6f0b918f8eb", "tabbable": null, "tooltip": null, "value": "

Results

" } }, "fb8505087abb4f9983ab7cc153ca3529": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }