{ "cells": [ { "cell_type": "markdown", "id": "efficient-shoot", "metadata": {}, "source": [ "\n", "\n", "\n", "

Python Programming: Sets and Tuples

\n", "\n", "\n", "\n", "---\n", "\n", "## Learning Objectives\n", "\n", "*After this lesson, you will be able to:*\n", "\n", "- Perform common actions with sets.\n", "- Perform common actions with tuples.\n", "- Know when to use different data structures.\n", "\n", "---\n", "\n", "## Discussion: Lists\n", "\n", "Here are some lists:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "christian-coverage", "metadata": {}, "outputs": [], "source": [ "unique_colors = [\"red\", \"yellow\", \"red\", \"green\", \"red\", \"yellow\"]\n", "subscribed_emails = [\"mary@gmail.com\", \"opal@gmail.com\", \"mary@gmail.com\", \"sayed@gmail.com\"]\n" ] }, { "cell_type": "markdown", "id": "leading-pizza", "metadata": {}, "source": [ "\n", "What could be a problem here?\n", "\n", "\n", "\n", "---\n", "\n", "## Introducing Sets\n", "\n", "\n", "Lists:\n" ] }, { "cell_type": "code", "execution_count": null, "id": "crazy-vinyl", "metadata": {}, "outputs": [], "source": [ "unique_colors_list = [\"red\", \"yellow\", \"red\", \"green\", \"red\", \"yellow\"]\n", "subscribed_emails_list = [\"mary@gmail.com\", \"opal@gmail.com\", \"mary@gmail.com\", \"sayed@gmail.com\"]\n" ] }, { "cell_type": "markdown", "id": "utility-spirit", "metadata": {}, "source": [ "\n", "Sets: an unordered collection of unique elements. These are powerful because set theory operations can be applied to them in O(1) time.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "sweet-overview", "metadata": {}, "outputs": [], "source": [ "unique_colors_set = {\"green\", \"yellow\", \"red\"}\n", "subscribed_emails_set = {\"mary@gmail.com\", \"opal@gmail.com\", \"sayed@gmail.com\"}\n" ] }, { "cell_type": "markdown", "id": "parental-style", "metadata": {}, "source": [ "\n", "- Notice the `{}` versus the `[]`.\n", "\n", "---\n", "\n", "\n", "## How Can We Make a Set?\n", "\n", "If we explicitly cast a set from a list, Python removes duplicates automatically.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "peripheral-overhead", "metadata": {}, "outputs": [], "source": [ "my_set = set(a_list_to_convert)\n", "\n", "# In action:\n", "unique_colors_list = [\"red\", \"yellow\", \"red\", \"green\", \"red\", \"yellow\"]\n", "unique_colors_set = set(unique_colors_list)\n", "# => {\"green\", \"yellow\", \"red\"}\n", "\n", "# In action:\n", "unique_colors_set_2 = set([\"red\", \"yellow\", \"red\", \"green\", \"red\", \"yellow\"])\n", "# => {\"green\", \"yellow\", \"red\"}\n" ] }, { "cell_type": "markdown", "id": "novel-elevation", "metadata": {}, "source": [ "\n", "We can make a set directly using curly braces:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "associate-bikini", "metadata": {}, "outputs": [], "source": [ "colors = {\"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"indigo\", \"violet\"}\n" ] }, { "cell_type": "markdown", "id": "informed-express", "metadata": {}, "source": [ "---\n", "\n", "## Important Note: Sets\n", "\n", "Lists are always in the same order:\n", "\n", "- `my_list = [\"green\", \"yellow\", \"red\"]` is always going to be`[\"green\", \"yellow\", \"red\"]`\n", "- `my_list[0]` is always `\"green\"`; `my_list[1]` is always `\"yellow\"`; `my_list[2]` is always `\"red\"`.\n", "\n", "Sets are not like this! Similar to dictionaries, they're not ordered.\n", "\n", "- `my_set = {\"green\", \"yellow\", \"red\"}` could later be `{\"red\", \"yellow\", \"green\"}`!\n", "- Note that python defaults to displaying an ascending sort of a set. Although this is displayed to the user when the variable is called via the interpreter, _the order cannot be relied upon_.\n", "\n", "We **cannot** do: `my_set[0]` - sets are unordered, and a `TypeError`\n", "exception will be thrown.\n", "\n", "---\n", "\n", "## We Do: Creating a Set from a List\n", "\n", "Let's make some sets!\n", "\n", "- Make a list `clothing_list` containing the main color of your classmates' clothing.\n", "- Using `clothing_list`, make a set named `clothing_set`.\n", "- Use a `for` loop to print out both `clothing_list` and `clothing_set`.\n", "- Try to print an index!" ] }, { "cell_type": "code", "execution_count": 5, "id": "intended-flesh", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "green\n", "blue\n", "white\n", "black\n", "\n", "white\n", "black\n", "green\n", "blue\n" ] }, { "ename": "TypeError", "evalue": "'set' object is not subscriptable", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 12\u001b[1;33m \u001b[0mclothing_set\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: 'set' object is not subscriptable" ] } ], "source": [ "clothing_list = ['green', 'blue', 'white', 'black']\n", "clothing_set = set(clothing_list)\n", "\n", "for item in clothing_list:\n", " print(item)\n", " \n", "print()\n", "\n", "for item in clothing_set:\n", " print(item)\n", " \n", "clothing_set[0]" ] }, { "cell_type": "markdown", "id": "clean-brown", "metadata": {}, "source": [ "---\n", "\n", "## We Do: Adding to a Set\n", "\n", "How do we add more to a set?" ] }, { "cell_type": "code", "execution_count": 6, "id": "literary-numbers", "metadata": {}, "outputs": [], "source": [ "# In a list:\n", "clothing_list.append(\"red\")\n", "\n", "# In a set\n", "clothing_set.add(\"red\")\n" ] }, { "cell_type": "markdown", "id": "prime-security", "metadata": {}, "source": [ "\n", "`add` vs `append` - this is because we can't guarantee it's going at the end!\n", "\n", "Let's add a few colors to `clothing_list` and `clothing_set` and then print them.\n", "\n", "- What happens if you add a duplicate?\n", "\n", "---\n", "\n", "## We Do: Removing from a List and a Set\n", "\n", "Remember, lists are always the same order and sets are not!\n", "\n", "- With the set `{\"green\", \"yellow\", \"red\"}`, `my_set[0]` could be `green`, `red`, or `yellow`.\n", "\n", "So thus, we need to be careful about removal:\n", "\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "impaired-happening", "metadata": {}, "outputs": [], "source": [ "# In a list:\n", "clothing_list.pop() # Removes and returns the last item in the list.\n", "clothing_list.pop(0) # Removes and returns a specific (here, the first) item in the list.\n", "\n", "# In a set\n", "clothing_set.pop() # Removes and returns an arbitrary element. This is probably not what you want to do in most cases.\n", "# clothing_set.pop(0) # Python throws a TypeError error (pop takes no arguments)\n", "clothing_set.remove('red') # This removes an element from the set directly, and raises KeyError if the element is not present. This is the most common use.\n", "clothing_set.discard('red') # This removes an element from the set directly, but does NOT throw a KeyError if the element is not present in the set.\n" ] }, { "cell_type": "markdown", "id": "solved-niger", "metadata": {}, "source": [ "\n", "---\n", "\n", "## We Do: Set Intersection\n", "\n", "- One thing that sets are _really_ good at is _relational algebra_ (set theory). This is a fancy word for a SQL join, or comparing elements between two sets.\n", "- Sets are really good at this because they use the same [hashing trick](https://en.wikipedia.org/wiki/Hash_table) under the hood that dictionaries use and makes them so fast.\n", "\n", "Let's start by making two sets:\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "moral-friend", "metadata": {}, "outputs": [], "source": [ "set1 = {1, 2, 3, 4, 5}\n", "set2 = {4, 5, 6, 7, 8}\n" ] }, { "cell_type": "markdown", "id": "intensive-reflection", "metadata": {}, "source": [ "\n", "---\n", "\n", "## We Do: Set Intersection\n", "\n", "\n", "Now let's use the `.intersection()` set method to find out _what elements these two sets have in common_:\n" ] }, { "cell_type": "code", "execution_count": null, "id": "adjacent-virus", "metadata": {}, "outputs": [], "source": [ "set1.intersection(set2)" ] }, { "cell_type": "markdown", "id": "regulation-match", "metadata": {}, "source": [ "\n", "Yields the result: `{4, 5}`\n", "\n", "- This makes sense, the two sets share the elements `4` and `5`.\n", "- Note that this is commutative, meaning we could also write `set2.intersection(set1)` and receive the same result.\n", "\n", "---\n", "\n", "## We Do: Set Differences\n", "\n", "- Instead of finding _elements in common_ between two sets, we can also find _their differences_.\n", "- To do this, we use `.difference()`.\n", "- Note that this method _is not commutative_, meaning _order matters_.\n", "- The difference is what is contained in the _first_ set, _but not in the second set_.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "loved-correspondence", "metadata": {}, "outputs": [], "source": [ "set1.difference(set2)" ] }, { "cell_type": "markdown", "id": "federal-sensitivity", "metadata": {}, "source": [ "\n", "Yields the result: `{1, 2, 3}`\n" ] }, { "cell_type": "code", "execution_count": null, "id": "amateur-possession", "metadata": {}, "outputs": [], "source": [ "set2.difference(set1)" ] }, { "cell_type": "markdown", "id": "elementary-opening", "metadata": {}, "source": [ "Yields the result: `{6, 7, 8}`\n", "\n", "---\n", "\n", "## Quick Review: Sets vs. Lists\n", "\n", "**Lists**:\n", "\n", "- The original, normal object.\n", "- Created with `[]`.\n", "- `append()`, `insert(index)`, `pop()`, `pop(index)`.\n", "- Duplicates and mutable.\n", "\n", "**Sets**:\n", "\n", "- Lists without duplicates.\n", "- Created with `{}` or with `set(my_list)`.\n", "- `add()` and `remove(element)`.\n", "\n", "---\n", "## Quick Review: Sets vs. Lists" ] }, { "cell_type": "code", "execution_count": null, "id": "victorian-simple", "metadata": {}, "outputs": [], "source": [ "### Creation ###\n", "# List\n", "my_list = [\"red\", \"yellow\", \"green\", \"red\"]\n", "# Sets\n", "my_set = {\"red\", \"yellow\", \"green\"}\n", "my_set2 = set(my_list)\n", "my_set = set(a_list_to_convert)\n", "\n", "### Appending a New Value ###\n", "my_list.append(\"blue\")\n", "my_set.add(\"blue\")\n", "\n", "### Appending a Duplicate ###\n", "my_list.append(\"blue\")\n", "# => my_list = [\"red\", \"yellow\", \"green\", \"red\", \"blue\", \"blue\"]\n", "my_set.add(\"blue\")\n", "# => my_set = {\"red\", \"yellow\", \"green\", \"blue\"}\n", "\n", "### Removing items: ###\n", "my_list.pop(1)\n", "my_set.remove(\"red\")\n" ] }, { "cell_type": "markdown", "id": "serial-sunglasses", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Discussion: Immutability Thoughts\n", "\n", "A set is a type of list which doesn't allow duplicates.\n", "\n", "What if, instead, we have a list we don't want to change?\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "killing-agenda", "metadata": {}, "outputs": [], "source": [ "rainbow_colors = [\"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"indigo\", \"violet\"]\n" ] }, { "cell_type": "markdown", "id": "executive-bunny", "metadata": {}, "source": [ "\n", "We **don't** want:\n" ] }, { "cell_type": "code", "execution_count": null, "id": "taken-celtic", "metadata": {}, "outputs": [], "source": [ "rainbow_colors[0] = \"gray\"\n", "## Gray's not in the rainbow!\n", "rainbow_colors.pop()\n", "## We can't lose violet!\n", "rainbow_colors.append(\"pink\")\n", "# Pink's not in the rainbow!\n" ] }, { "cell_type": "markdown", "id": "premier-notebook", "metadata": {}, "source": [ "\n", "We want `rainbow_colors` to be **immutable** - the list _cannot_ be changed.\n", "\n", "How we do that in Python?\n", "\n", "---\n", "\n", "## Introducing: Tuples\n", "\n", "**Sets** have the following properties:\n", "\n", "- No duplicates\n", "- Mutable\n", "\n", "**Tuples** are similar to a list with the following differences:\n", "\n", "- Allows duplicates (same as a list)\n", "- Once assigned, the tuple _cannot be changed_\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "lined-exclusive", "metadata": {}, "outputs": [], "source": [ "rainbow_colors_tuple = (\"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"indigo\", \"violet\")\n" ] }, { "cell_type": "markdown", "id": "through-inflation", "metadata": {}, "source": [ "\n", "When should you use a tuple?\n", "\n", "- When you need data protection through immutability (note: all Python variables are public).\n", "- When you never want to change the list.\n", "- Tuples are sometimes wrapped in a class namespace to simulate what would be done with a [const structure](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/how-to-define-constants) in a C-based language.\n", "- This is a way of holding appconstants, or constants your program will use (like the API endpoint of a server, credentials, etc.)\n", "\n", "---\n", "\n", "## Tuple Syntax\n", "\n", "- Created with parentheses `()`.\n", "- Access values via indices (like regular lists, but *not* like sets).\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "changed-incident", "metadata": {}, "outputs": [], "source": [ "rainbow_colors_tuple = (\"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"indigo\", \"violet\")\n", "print(rainbow_colors[1])" ] }, { "cell_type": "markdown", "id": "genetic-tragedy", "metadata": {}, "source": [ "\n", "- Tuples can be printed with a `for` loop (just like a set or list!).\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "roman-mississippi", "metadata": {}, "outputs": [], "source": [ "rainbow_colors_tuple = (\"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"indigo\", \"violet\")\n", "\n", "for color in rainbow_colors_tuple:\n", " print(color)" ] }, { "cell_type": "markdown", "id": "conceptual-baker", "metadata": {}, "source": [ "---\n", "\n", "## We Do: Tuples\n", "\n", "Let's declare a tuple named `seasons` and set it to have the values `fall`, `winter`, `spring`, and `summer`. We'll print the tuple and each value. Then we'll try to reassign them (we can't)!" ] }, { "cell_type": "code", "execution_count": 9, "id": "coral-channel", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('fall', 'winter', 'spring', 'summer')\n", "fall\n", "winter\n", "spring\n", "summer\n" ] }, { "ename": "TypeError", "evalue": "'tuple' object does not support item assignment", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mseason\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m \u001b[0mseasons\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'more summer, please'\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] } ], "source": [ "seasons = ('fall', 'winter', 'spring', 'summer')\n", "\n", "print(seasons)\n", "\n", "for season in seasons:\n", " print(season)\n", "\n", "seasons[0] = 'more summer, please'" ] }, { "cell_type": "markdown", "id": "unlimited-spoke", "metadata": {}, "source": [ "---\n", "\n", "## Quick Review: Sets, Tuples, Lists\n", "\n", "**List**:\n", "\n", "- The original, normal object: `[\"red\", \"red\", \"yellow\", \"green\"]`.\n", "- Has duplicates; mutable: `append()`, `insert(index)`, `pop()`, `pop(index)`\n", "\n", "**Set**:\n", "\n", "- List without duplicates: `{\"red\", \"yellow\", \"green\"}`.\n", "- Mutable: `add()` and `remove(element)`\n", "\n", "**Tuple**:\n", "\n", "- Has duplicates, but immutable: You can't change it!\n", "- `(\"red\", \"red\", \"yellow\", \"green\")` will *always* be `(\"red\", \"red\", \"yellow\", \"green\")`.\n", "\n", "---\n", "\n", "## Quick Review: Sets, Tuples, Lists" ] }, { "cell_type": "code", "execution_count": null, "id": "genuine-thirty", "metadata": {}, "outputs": [], "source": [ "### Creation ###\n", "# List\n", "my_list = [\"red\", \"yellow\", \"green\", \"red\"]\n", "# Sets\n", "my_set = {\"red\", \"yellow\", \"green\"}\n", "my_set2 = set(my_list))\n", "my_set = set(a_list_to_convert)\n", "# Tuples\n", "my_tuple = (\"red\", \"yellow\", \"green\")\n", "\n", "### Appending a New Value ###\n", "my_list.append(\"blue\")\n", "my_set.add(\"blue\")\n", "# Tuples -> You can't!\n", "\n", "### Removing items: ###\n", "my_list.pop(1)\n", "my_set.remove(\"red\")\n", "# Tuples -> You can't!\n" ] }, { "cell_type": "markdown", "id": "fatty-church", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Introducing Types\n", "\n", "Variables certainly can hold a lot!\n", "\n", "- Sets, tuples, and lists are easily confused.\n", "- `type()` tells us what a variable is: set, tuple, list, dictionary, integer, string - anything!\n", "\n", "Try it:" ] }, { "cell_type": "code", "execution_count": 10, "id": "lyric-adams", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "unique_colors is \n", "unique_colors_2 is \n", "unique_colors_3 is \n", "my_number is \n", "my_string is \n" ] } ], "source": [ "unique_colors = set([\"red\", \"yellow\", \"green\", \"red\"])\n", "print(\"unique_colors is\", type(unique_colors))\n", "# --\n", "unique_colors_2 = [\"red\", \"yellow\", \"green\", \"red\"]\n", "print(\"unique_colors_2 is\", type(unique_colors_2))\n", "# --\n", "unique_colors_3 = (\"red\", \"yellow\", \"green\", \"red\")\n", "print(\"unique_colors_3 is\", type(unique_colors_3))\n", "# --\n", "my_number = 2\n", "print(\"my_number is\", type(my_number))\n", "# --\n", "my_string = \"Hello!\"\n", "print(\"my_string is\", type(my_string))\n" ] }, { "cell_type": "markdown", "id": "departmental-client", "metadata": {}, "source": [ "\n", "---\n", "\n", "## You Do: List Types Practice\n", "\n", "- Create a list (`[]`), set (`{}`), and tuple (`()`) of some of your favorite foods.\n", "\n", "Next, in every list type that you can:\n", "\n", "1. Add `\"pizza\"` anywhere; append `\"eggs\"` to the end.\n", "2. Remove `\"pizza\"`.\n", "3. Re-assign the element at index `1` to be `\"popcorn\"`.\n", "4. Remove the element at index `2` and re-insert it at index `0`.\n", "5. Print the element at index `0`.\n", "\n", "Print your final \"lists\" using a loop, then print their types. Don't throw an error!" ] }, { "cell_type": "code", "execution_count": 14, "id": "european-ivory", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "chicken\n", "ice cream\n", "\n", "\n", "chicken\n", "ice cream\n", "popcorn\n", "tacos\n", "eggs\n", "\n", "ice cream\n", "chicken\n", "cheeseburger\n", "tacos\n", "\n", "ice cream\n", "cheeseburger\n", "chicken\n", "tacos\n" ] } ], "source": [ "food_list = ['ice cream', 'cheeseburger', 'chicken', 'tacos']\n", "food_set = {'ice cream', 'cheeseburger', 'chicken', 'tacos'}\n", "food_tuple = ('ice cream', 'cheeseburger', 'chicken', 'tacos')\n", "\n", "# 1.\n", "food_list.append('pizza')\n", "food_set.add('pizza')\n", "food_list.append('eggs')\n", "\n", "# 2.\n", "food_list.pop(food_list.index('pizza'))\n", "food_set.remove('pizza')\n", "\n", "# 3.\n", "food_list[1] = 'popcorn'\n", "\n", "# 4. \n", "food_list.insert(0, food_list.pop(2))\n", "\n", "# 5.\n", "print(food_list[0])\n", "print(food_tuple[0])\n", "\n", "print()\n", "\n", "print(type(food_list))\n", "for item in food_list:\n", " print(item)\n", " \n", "print(type(food_set)) \n", "for item in food_set:\n", " print(item)\n", " \n", "print(type(food_tuple)) \n", "for item in food_tuple:\n", " print(item)" ] }, { "cell_type": "markdown", "id": "coordinate-walker", "metadata": {}, "source": [ "---\n", "\n", "## Summary and Q&A\n", "\n", "We've learned two new types of lists:\n", "\n", "Sets:\n", "\n", "- A mutable list without duplicates.\n", "- Handy for storing emails, usernames, and other unique elements." ] }, { "cell_type": "code", "execution_count": null, "id": "later-details", "metadata": {}, "outputs": [], "source": [ "email_set = {'my_email@gmail.com', 'second_email@yahoo.com', \"third_email@hotmail.com\"}\n" ] }, { "cell_type": "markdown", "id": "smart-pursuit", "metadata": {}, "source": [ "\n", "Tuples:\n", "\n", "- An immutable list that allows duplicates.\n", "- Handy for storing anything that won't change.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "numeric-fence", "metadata": {}, "outputs": [], "source": [ "rainbow_tuple = (\"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"indigo\", \"violet\")" ] }, { "cell_type": "markdown", "id": "christian-ready", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Additional Reading\n", "\n", "- [Repl.it that recaps Tuples](https://repl.it/@GAcoding/python-programming-tuple-practice?lite=true)\n", "- [Python Count Occurrences of Letters, Words and Numbers in Strings and Lists-Video](https://www.youtube.com/watch?v=szIFFw_Xl_M)\n", "- [Storing Multiple Values in Lists](https://swcarpentry.github.io/python-novice-inflammation/03-lists/)\n", "- [Sets and Frozen Sets](https://www.python-course.eu/sets_frozensets.php)\n", "- [Sets](https://www.learnpython.org/en/Sets)\n", "- [Python Tuple](https://www.programiz.com/python-programming/tuple)\n", "- [Tuples](http://openbookproject.net/thinkcs/python/english3e/tuples.html)\n", "- [Strings, Lists, Tuples, and Dictionaries Video](https://www.youtube.com/watch?v=19EfbO5D_8s)\n", "- [Python Data Structures: Lists, Tuples, Sets, and Dictionaries Video](https://www.youtube.com/watch?v=R-HLU9Fl5ug)\n" ] } ], "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.7.6" } }, "nbformat": 4, "nbformat_minor": 5 }