You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
645 lines
17 KiB
645 lines
17 KiB
<!--
|
|
title: Further Data Structures
|
|
type: lesson
|
|
duration: 00:40
|
|
creator: Steve Peters
|
|
-->
|
|
|
|
##  {.separator}
|
|
|
|
<h1>Python Programming: Sets and Tuples</h1>
|
|
|
|
<!--
|
|
|
|
## Overview
|
|
This lesson focuses on sets and tuples. It starts with sets, encompassing We Dos as new functions are introduced, then goes into tuples. It ends with the `type` function and a You Do. If there's time, after the "Additional Reading" slides, there is a sets exercise. This exercises are also in the `xx-additional-exercises` folder, if you don't get to it.
|
|
|
|
## Important Notes or Prerequisites
|
|
- The students will be asked to build upon their knowledge of the `list`, so a solid understanding of this concept will be vital.
|
|
- The "why" of each datatype is essential to impart to students and your checks for understanding may keep circling back around to the "why".
|
|
- Much of this lesson contrasts the three data types (tuples, sets, lists) to each other, so that students can see them side by side and start to internalize the differences.
|
|
|
|
## Learning Objectives
|
|
In this lesson, students will:
|
|
|
|
- Perform common actions with sets.
|
|
- Perform common actions with tuples.
|
|
- Know when to use each of the different collection structures.
|
|
|
|
|
|
## Duration
|
|
40 minutes
|
|
|
|
### Timing note:
|
|
- If there's time remaining at the end, giving exercises involving multiple contrasting sets, tuples, and lists would be great.
|
|
- There is, in the `xx-additional-exercises` folder in the parent folder, a set equals challenge that you should give in class if there's time, and if not, give as homework.
|
|
|
|
## Suggested Agenda
|
|
|
|
| Time | Activity |
|
|
| --- | --- |
|
|
| 0:00 - 0:02 | Welcome |
|
|
| 0:02 - 0:20 | Sets |
|
|
| 0:20 - 0:37 | Tuples |
|
|
| 0:37 - 0:40 | Summary |
|
|
|
|
## In Class: Materials
|
|
- Projector
|
|
- Internet connection
|
|
- Python3
|
|
-->
|
|
|
|
---
|
|
|
|
## Learning Objectives
|
|
|
|
*After this lesson, you will be able to:*
|
|
|
|
- Perform common actions with sets.
|
|
- Perform common actions with tuples.
|
|
- Know when to use different data structures.
|
|
|
|
<aside class="notes">
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Quickly overview these; perhaps write them on the board.
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Discussion: Lists
|
|
|
|
Here are some lists:
|
|
|
|
```python
|
|
unique_colors = ["red", "yellow", "red", "green", "red", "yellow"]
|
|
subscribed_emails = ["mary@gmail.com", "opal@gmail.com", "mary@gmail.com", "sayed@gmail.com"]
|
|
```
|
|
|
|
What could be a problem here?
|
|
|
|
<aside class="notes">
|
|
|
|
**Talking Points**:
|
|
|
|
- "Why, in the `subscribed_emails` list, would duplicate entries be a problem? Or unique colors having duplicates?"
|
|
|
|
**Teaching Tips**:
|
|
|
|
- You can guide students to think about deduplication and the need to ensure unique values, thus dovetailing into sets
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Introducing Sets
|
|
|
|
|
|
Lists:
|
|
```python
|
|
unique_colors_list = ["red", "yellow", "red", "green", "red", "yellow"]
|
|
subscribed_emails_list = ["mary@gmail.com", "opal@gmail.com", "mary@gmail.com", "sayed@gmail.com"]
|
|
```
|
|
|
|
Sets: Lists without duplicates!
|
|
```python
|
|
unique_colors_set = {"green", "yellow", "red"}
|
|
subscribed_emails_set = {"mary@gmail.com", "opal@gmail.com", "sayed@gmail.com"}
|
|
```
|
|
|
|
- Notice the `[]` versus the `{}`.
|
|
|
|
<aside class="notes">
|
|
|
|
**Talking Points**:
|
|
|
|
- Refresh memories that a *list* is a collection of *elements*, contained within square brackets `[]`:
|
|
|
|
- "However, there is a specific version of a *list* called a *set*. What makes a set different is that all of the *elements* in a *set* must be unique. That is to say, nothing can appear more than once in a *set*." Sets have curly braces.
|
|
|
|
</aside>
|
|
|
|
|
|
---
|
|
|
|
|
|
## How Can We Make a Set?
|
|
|
|
|
|
Making a set via a list - Python removes duplicates automatically.
|
|
|
|
```python
|
|
my_set = set(a_list_to_convert)
|
|
|
|
# In action:
|
|
unique_colors_list = ["red", "yellow", "red", "green", "red", "yellow"]
|
|
unique_colors_set = set(unique_colors_list)
|
|
# => {"green", "yellow", "red"}
|
|
|
|
# Instead of passing a list in (a_list_to_convert), we could just type it:
|
|
my_set_2 = (["enter", "list", "here"])
|
|
|
|
# In action:
|
|
unique_colors_set_2 = set(["red", "yellow", "red", "green", "red", "yellow"])
|
|
# => {"green", "yellow", "red"}
|
|
```
|
|
|
|
Making a set directly, in curly braces:
|
|
|
|
```python
|
|
colors = {"red", "orange", "yellow", "green", "blue", "indigo", "violet"}
|
|
```
|
|
|
|
<aside class="notes">
|
|
|
|
**Talking Points**:
|
|
|
|
- "Creating a *set* is easy; we just need to use the `set()` method like this."
|
|
|
|
- "Because we had two `red`s, Python removed the extra one for us."
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Point out the difference between parentheses, brackets, and curly braces.
|
|
|
|
</aside>
|
|
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Important Note: Sets
|
|
|
|
Lists are always in the same order:
|
|
|
|
- `my_list = ["green", "yellow", "red"]` is always going to be`["green", "yellow", "red"]`
|
|
- `my_list[0]` is always `"green"`; `my_list[1]` is always `"yellow"`; `my_list[2]` is always `"red"`.
|
|
|
|
Sets are not! Like dictionaries, they're in any order.
|
|
|
|
- `my_set = {"green", "yellow", "red"}` could later be `{"red", "yellow", "green"}`!
|
|
- `my_set[0]` could be `"green"`, `"red"`, or `"yellow"` - we don't know!
|
|
|
|
We **cannot** do: `print(my_set[0])` - it could be anything! Python won't let us.
|
|
|
|
---
|
|
|
|
## We Do: Creating a Set from a List
|
|
|
|
Let's pull up a new `set_practice.py` file and make some sets!
|
|
|
|
- Make a list `clothing_list` containing the main color of your classmates' clothing.
|
|
- Using `clothing_list`, make a set named `clothing_set`.
|
|
- Use a `for` loop to print out both `clothing_list` and `clothing_set`.
|
|
- Try to print an index!
|
|
|
|
<aside class="notes">
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Run through this with them - make sure they are following along to practice typing the syntax.
|
|
- Be prepared to refresh memories on `for` loops.
|
|
- Try to print an index - reinforce that sets are in any order.
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## We Do: Adding to a Set
|
|
|
|
How do we add more to a set?
|
|
|
|
```python
|
|
# In a list:
|
|
clothing_list.append("red")
|
|
|
|
# In a set
|
|
clothing_set.add("red")
|
|
```
|
|
|
|
`add` vs `append` - this is because we can't guarantee it's going at the end!
|
|
|
|
Let's a few colors to `clothing_list` and `clothing_set`, then print them.
|
|
|
|
- What happens if you add a duplicate?
|
|
|
|
<aside class="notes">
|
|
|
|
**Talking Points**:
|
|
|
|
- Continue locally with the list and set they created previously - do this with them!
|
|
- Try to add a duplicate, then print. Call out that it just doesn't appear, since sets can't have duplicates.
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## We Do: Removing from a List and a Set
|
|
|
|
Remember, lists are always the same order: `["green", "yellow", "red"]`.
|
|
|
|
- `my_list[0]` is always "green".
|
|
|
|
Remember, sets are not!
|
|
|
|
- With the set `{"green", "yellow", "red"}`, `my_set[0]` could be `green`, `red`, or `yellow`.
|
|
|
|
The same way, we need to be careful about removal:
|
|
|
|
```python
|
|
# In a list:
|
|
clothing_list.pop() # Removes and returns the last item in the list.
|
|
clothing_list.pop(0) # Removes and returns a specific (here, the first) item in the list.
|
|
|
|
# In a set
|
|
clothing_set.pop() # No! This is unreliable! The order is arbitrary.
|
|
clothing_set.pop(0) # No! Python throws an error! You can't index sets.
|
|
clothing_set.remove('red') # Do this! Call the element directly!
|
|
```
|
|
|
|
<aside class="notes">
|
|
|
|
Teaching points:
|
|
|
|
- Walk through these. `pop` from the set to show that it's unreliable.
|
|
|
|
**Talking Points**:
|
|
|
|
- Address that for lists, the order matters. For sets, it's irrelevant, so `pop` returns an arbitrary element.
|
|
- Discuss the difference between `remove` and `pop`.
|
|
|
|
</aside>
|
|
---
|
|
|
|
## Quick Review: Sets vs. Lists
|
|
|
|
**Lists**:
|
|
|
|
- The original, normal object.
|
|
- Created with `[]`.
|
|
- `append()`, `insert(index)`, `pop()`, `pop(index)`.
|
|
- Duplicates and mutable.
|
|
|
|
**Sets**:
|
|
|
|
- Lists without duplicates.
|
|
- Created with `{}` or with `set(my_list)`.
|
|
- `add()` and `remove(element)`.
|
|
|
|
<aside class="notes">
|
|
|
|
**Teaching Tips**:
|
|
|
|
- A code review for all of these are on the next slide.
|
|
- Review these - on this slide, do a check for conceptual understanding.
|
|
</aside>
|
|
|
|
## Quick Review: Sets vs. Lists
|
|
|
|
```python
|
|
### Creation ###
|
|
# List
|
|
my_list = ["red", "yellow", "green", "red"]
|
|
# Sets
|
|
my_set = {"red", "yellow", "green"}
|
|
my_set2 = set(my_list)
|
|
my_set = set(a_list_to_convert)
|
|
|
|
### Appending a New Value ###
|
|
my_list.append("blue")
|
|
my_set.add("blue")
|
|
|
|
### Appending a Duplicate ###
|
|
my_list.append("blue")
|
|
# => my_list = ["red", "yellow", "green", "red", "blue", "blue"]
|
|
my_set.add("blue")
|
|
# => my_set = {"red", "yellow", "green", "blue"}
|
|
|
|
### Removing items: ###
|
|
my_list.pop(1)
|
|
my_set.remove("red")
|
|
```
|
|
|
|
<aside class="notes">
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Do a quick check for understanding.
|
|
- Go through each example.
|
|
|
|
**Talking Points**:
|
|
|
|
- Point out again the difference in syntax, especially with curly braces.
|
|
- Reinforce `pop` being unreliable.
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Discussion: Immutability Thoughts
|
|
|
|
A set is a type of list which doesn't allow duplicates.
|
|
|
|
What if, instead, we have a list we don't want to change?
|
|
|
|
```python
|
|
rainbow_colors = ("red", "orange", "yellow", "green", "blue", "indigo", "violet")
|
|
```
|
|
|
|
We **don't** want:
|
|
```python
|
|
rainbow_colors[0] = ("gray")
|
|
## Gray's not in the rainbow!
|
|
rainbow_colors.pop()
|
|
## We can't lose violet!
|
|
rainbow_colors.append("pink")
|
|
# Pink's not in the rainbow!
|
|
```
|
|
|
|
We want `rainbow_colors` to be **immutable** - the list _cannot_ be changed.
|
|
|
|
How we do that in Python?
|
|
|
|
<aside class="notes">
|
|
|
|
**Talking Points**:
|
|
|
|
- We're done with sets.
|
|
- Immutable means "unchangeable".
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Introducing: Tuples
|
|
|
|
Sets are one specific type of list.
|
|
|
|
- No duplicates, but mutable.
|
|
|
|
**Tuples** are another specific type of list.
|
|
|
|
- Duplicates, but immutable.
|
|
- A list that _cannot_ be changed.
|
|
|
|
```python
|
|
rainbow_colors_tuple = ("red", "orange", "yellow", "green", "blue", "indigo", "violet")
|
|
```
|
|
|
|
When should you use a tuple?
|
|
|
|
- When you need data protection through immutability.
|
|
- When you never want to change the list.
|
|
|
|
<aside class="notes">
|
|
|
|
**Talking Points**:
|
|
|
|
- Point out that with tuples, duplicates are fine! Be clear that tuples are another kind of list, NOT a kind of set.
|
|
* Python offers a data structure that provides more secure usage than the wide power of a fully mutable list.
|
|
* The **tuple** is a kind of data structure that provides immutable values in a list.
|
|
* Once a tuple is created and assigned its elements, no changes can be made to the tuple.
|
|
* "Why? Isn't it more useful to work with a list that allows us to change elements when necessary? Doesn't this inflexibility make our code easier to break?
|
|
- "We will frequently need the power to create and edit lists, adding and removing items from them. In these instances, use a list."
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Tuple Syntax
|
|
|
|
- Created with parentheses `()`.
|
|
- Access values via indices (like regular lists, but *not* like sets).
|
|
|
|
```python
|
|
rainbow_colors_tuple = ("red", "orange", "yellow", "green", "blue", "indigo", "violet")
|
|
print(rainbow_colors[1])
|
|
# Prints "orange"
|
|
```
|
|
|
|
- Tuples can be printed with a `for` loop (just like a set or list!).
|
|
|
|
```python
|
|
rainbow_colors_tuple = ("red", "orange", "yellow", "green", "blue", "indigo", "violet")
|
|
|
|
for color in rainbow_colors_tuple:
|
|
print(color)
|
|
```
|
|
|
|
<aside class="notes">
|
|
**Talking Points**:
|
|
|
|
- Tuples work exactly like lists, except that, when you create a tuple, you use parentheses instead of square brackets.
|
|
- You can include anything you want, but, for now, we'll add strings.
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## We Do: Tuples
|
|
|
|
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)!
|
|
|
|
<iframe height="400px" width="100%" src="https://repl.it/@GAcoding/blank-repl?lite=true" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals"></iframe>
|
|
|
|
<aside class="notes">
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Make sure they're doing this with you.
|
|
- Print out each value directly with indexes. Then, use a `for` loop.
|
|
- Try to change values - pop, append, and direct reassignment.
|
|
|
|
Talking point:
|
|
|
|
- Remind them of the syntax - perhaps make sets and lists as well, so students can see them compared again.
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Quick Review: Sets, Tuples, Lists
|
|
|
|
**List**:
|
|
|
|
- The original, normal object: `["red", "red", "yellow", "green"]`.
|
|
- Has duplicates; mutable: `append()`, `insert(index)`, `pop()`, `pop(index)`
|
|
|
|
**Set**:
|
|
|
|
- List without duplicates: `{"red", "yellow", "green"}`.
|
|
- Mutable: `add()` and `remove(element)`
|
|
|
|
**Tuple**:
|
|
|
|
- Has duplicates, but immutable: You can't change it!
|
|
- `("red", "red", "yellow", "green")` will *always* be `("red", "red", "yellow", "green")`.
|
|
|
|
<aside class="notes">
|
|
|
|
**Teaching Tips**:
|
|
|
|
- A code review for all of these are on the next slide.
|
|
- Remind them about `add` vs `append` - this is because we can't guarantee it's going at the end!
|
|
- Review these - on this slide, do a check for conceptual understanding.
|
|
- Always reinforce the `[]` vs `{}` vs `()`
|
|
- Recap immutability.
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Quick Review: Sets, Tuples, Lists
|
|
|
|
```python
|
|
### Creation ###
|
|
# List
|
|
my_list = ["red", "yellow", "green", "red"]
|
|
# Sets
|
|
my_set = {"red", "yellow", "green"}
|
|
my_set2 = set(my_list))
|
|
my_set = set(a_list_to_convert)
|
|
# Tuples
|
|
my_tuple = ("red", "yellow", "green")
|
|
|
|
### Appending a New Value ###
|
|
my_list.append("blue")
|
|
my_set.add("blue")
|
|
# Tuples -> You can't!
|
|
|
|
### Removing items: ###
|
|
my_list.pop(1)
|
|
my_set.remove("red")
|
|
# Tuples -> You can't!
|
|
```
|
|
|
|
<aside class="notes">
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Do a check for understanding of the code syntax.
|
|
- Go through each example.
|
|
|
|
**Talking Points**:
|
|
|
|
- Recap the types of braces to create each; remove vs pop; append vs add.
|
|
- Remind students that they aren't expected to be syntax experts - they can always look this up. Working programmers look things up every day on the job, but students have to know what things are and what to expect.
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## Introducing Types
|
|
|
|
Variables certainly can hold a lot!
|
|
|
|
- Sets, tuples, and lists are easily confused.
|
|
- `type()` tells us what a variable is: set, tuple, list, dictionary, integer, string - anything!
|
|
|
|
Try it:
|
|
|
|
<iframe height="300px" width="100%" src="https://repl.it/@SuperTernary/python-programming-types?lite=true" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals"></iframe>
|
|
|
|
|
|
<aside class="notes">
|
|
|
|
**Talking Points**:
|
|
|
|
- It's useful to know what datatype a variable is and how to use it. This will work on anything.
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Walk through each of these. It will recap the syntax as well as re-inforce using `type`. You might want to open the repl.it in a new window, as it's a bit long.
|
|
|
|
|
|
**Repl.it Note**: This replit has:
|
|
```python
|
|
unique_colors = set(["red", "yellow", "green", "red"])
|
|
print("unique_colors is", type(unique_colors))
|
|
# --
|
|
unique_colors_2 = ["red", "yellow", "green", "red"]
|
|
print("unique_colors_2 is", type(unique_colors_2))
|
|
# --
|
|
unique_colors_3 = ("red", "yellow", "green", "red")
|
|
print("unique_colors_3 is", type(unique_colors_3))
|
|
# --
|
|
my_number = 2
|
|
print("my_number is", type(my_number))
|
|
# --
|
|
my_string = "Hello!"
|
|
print("my_string is", type(my_string))
|
|
```
|
|
|
|
</aside>
|
|
|
|
---
|
|
|
|
## You Do: List Types Practice
|
|
|
|
Create a local file, `sets_tuples.py`. In it:
|
|
|
|
- Create a list (`[]`), set (`{}`), and tuple (`()`) of some of your favorite foods.
|
|
- Create a second set from the list.
|
|
|
|
Next, in every list type that you can:
|
|
|
|
- Add `"pizza"` anywhere; append `"eggs"` to the end.
|
|
- Remove `"pizza"`.
|
|
- Re-assign the element at index `1` to be `"popcorn"`.
|
|
- Remove the element at index `2` and re-insert it at index `0`.
|
|
- Print the element at index `0`.
|
|
|
|
Print your final lists using a loop, then print their types. Don't throw an error!
|
|
|
|
<aside class="notes">
|
|
|
|
10 minutes
|
|
|
|
**Teaching Tips**:
|
|
|
|
- Give students time to do this - it's a lot of syntax to go back through and find.
|
|
- Walk around the room to check for questions and offer help when needed.
|
|
- Once most of them have it, go over the answer. Make sure you remove pizza in the list, too.
|
|
|
|
</aside>
|
|
|
|
|
|
---
|
|
|
|
## Summary and Q&A
|
|
|
|
We've learned two new types of lists:
|
|
|
|
Sets:
|
|
|
|
- A mutable list without duplicates.
|
|
- Handy for storing emails, usernames, and other unique elements.
|
|
|
|
```python
|
|
email_set = {'my_email@gmail.com', 'second_email@yahoo.com', "third_email@hotmail.com"}
|
|
```
|
|
|
|
Tuples:
|
|
|
|
- An immutable list that allows duplicates.
|
|
- Handy for storing anything that won't change.
|
|
|
|
```python
|
|
rainbow_tuple = ("red", "orange", "yellow", "green", "blue", "indigo", "violet")
|
|
```
|
|
|
|
---
|
|
|
|
## Additional Reading
|
|
|
|
- [Repl.it that recaps Tuples](https://repl.it/@SuperTernary/python-programming-tuple-practice?lite=true)
|
|
- [Python Count Occurrences of Letters, Words and Numbers in Strings and Lists-Video](https://www.youtube.com/watch?v=szIFFw_Xl_M)
|
|
- [Storing Multiple Values in Lists](https://swcarpentry.github.io/python-novice-inflammation/03-lists/)
|
|
- [Sets and Frozen Sets](https://www.python-course.eu/sets_frozensets.php)
|
|
- [Sets](https://www.learnpython.org/en/Sets)
|
|
- [Python Tuple](https://www.programiz.com/python-programming/tuple)
|
|
- [Tuples](http://openbookproject.net/thinkcs/python/english3e/tuples.html)
|
|
- [Strings, Lists, Tuples, and Dictionaries Video](https://www.youtube.com/watch?v=19EfbO5D_8s)
|
|
- [Python Data Structures: Lists, Tuples, Sets, and Dictionaries Video](https://www.youtube.com/watch?v=R-HLU9Fl5ug)
|