Skip to content

Latest commit

 

History

History
285 lines (211 loc) · 9.68 KB

File metadata and controls

285 lines (211 loc) · 9.68 KB

Exploring Unordered Sets in Python

Slide 1: Introduction to Sets in Python

Sets in Python are unordered collections of unique elements. They are versatile data structures used for storing multiple items without duplicates. Unlike lists or dictionaries, sets do not maintain a specific order of elements and cannot contain duplicate values. This makes them ideal for tasks that require uniqueness and fast membership testing.

# Creating a set
fruits = {"apple", "banana", "cherry"}
print(fruits)  # Output: {'cherry', 'banana', 'apple'} (order may vary)

# Trying to add a duplicate
fruits.add("apple")
print(fruits)  # Output: {'cherry', 'banana', 'apple'} (no change)

# Fast membership testing
print("banana" in fruits)  # Output: True

Slide 2: Creating Sets

Sets can be created using curly braces {} or the set() constructor. When using curly braces, separate elements with commas. The set() constructor can create sets from any iterable object, such as lists or tuples.

# Creating sets using different methods
set1 = {1, 2, 3, 4, 5}
set2 = set([3, 4, 5, 6, 7])
set3 = set("hello")

print(set1)  # Output: {1, 2, 3, 4, 5}
print(set2)  # Output: {3, 4, 5, 6, 7}
print(set3)  # Output: {'h', 'e', 'l', 'o'}

Slide 3: Adding and Removing Elements

Sets are mutable, allowing you to add or remove elements after creation. Use the add() method to insert a single element and update() to add multiple elements. To remove elements, use remove() or discard(). The difference is that remove() raises a KeyError if the element is not found, while discard() doesn't.

colors = {"red", "green", "blue"}

# Adding elements
colors.add("yellow")
colors.update(["purple", "orange"])

# Removing elements
colors.remove("green")
colors.discard("black")  # No error if "black" doesn't exist

print(colors)  # Output: {'red', 'blue', 'yellow', 'purple', 'orange'}

Slide 4: Set Operations

Sets support various mathematical operations like union, intersection, and difference. These operations are useful for comparing and combining sets efficiently.

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# Union
union_set = set1.union(set2)
print("Union:", union_set)  # Output: {1, 2, 3, 4, 5, 6, 7, 8}

# Intersection
intersection_set = set1.intersection(set2)
print("Intersection:", intersection_set)  # Output: {4, 5}

# Difference
difference_set = set1.difference(set2)
print("Difference:", difference_set)  # Output: {1, 2, 3}

Slide 5: Set Comprehensions

Set comprehensions provide a concise way to create sets based on existing iterables. They follow a syntax similar to list comprehensions but use curly braces instead of square brackets.

# Creating a set of squares of even numbers from 0 to 9
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares)  # Output: {0, 64, 4, 36, 16}

# Creating a set of unique characters from a string
unique_chars = {char.upper() for char in "hello world"}
print(unique_chars)  # Output: {'H', 'E', 'L', 'O', 'W', 'R', 'D', ' '}

Slide 6: Frozen Sets

Frozen sets are immutable versions of regular sets. They have the same methods as regular sets, except those that modify the set. Frozen sets can be used as dictionary keys or as elements of other sets.

# Creating a frozen set
frozen_fruits = frozenset(["apple", "banana", "cherry"])

# Attempting to modify the frozen set (will raise an error)
try:
    frozen_fruits.add("orange")
except AttributeError as e:
    print("Error:", e)  # Output: Error: 'frozenset' object has no attribute 'add'

# Using a frozen set as a dictionary key
preferences = {
    frozenset(["apple", "banana"]): "Alice",
    frozenset(["cherry", "date"]): "Bob"
}
print(preferences)  # Output: {frozenset({'apple', 'banana'}): 'Alice', frozenset({'cherry', 'date'}): 'Bob'}

Slide 7: Set Methods

Sets provide various methods for manipulation and comparison. Some commonly used methods include clear(), copy(), issubset(), issuperset(), and symmetric_difference().

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# Clear all elements from set1
set1.clear()
print("Cleared set1:", set1)  # Output: set()

# Create a copy of set2
set3 = set2.copy()
print("Copy of set2:", set3)  # Output: {8, 4, 5, 6, 7}

# Check if set3 is a subset of set2
print("Is set3 subset of set2?", set3.issubset(set2))  # Output: True

# Symmetric difference (elements in either set, but not in both)
sym_diff = set2.symmetric_difference({4, 5, 9, 10})
print("Symmetric difference:", sym_diff)  # Output: {6, 7, 8, 9, 10}

Slide 8: Real-life Example: Unique Visitors

Imagine you're tracking unique visitors to a website. Sets are perfect for this task as they automatically handle duplicates and provide fast lookup times.

# Simulating website visitors over a week
daily_visitors = [
    ["user1", "user2", "user3"],
    ["user2", "user4", "user5"],
    ["user1", "user3", "user5"],
    ["user6", "user2", "user1"],
    ["user3", "user4", "user6"],
    ["user5", "user2", "user1"],
    ["user4", "user3", "user2"]
]

unique_visitors = set()
for day in daily_visitors:
    unique_visitors.update(day)

print("Total unique visitors:", len(unique_visitors))
print("Unique visitors:", unique_visitors)

Slide 9: Results for: Real-life Example: Unique Visitors

Total unique visitors: 6
Unique visitors: {'user1', 'user2', 'user3', 'user4', 'user5', 'user6'}

Slide 10: Real-life Example: Recipe Ingredient Comparison

Sets can be useful in comparing ingredients across different recipes. This example demonstrates how to find common and unique ingredients between two recipes.

recipe1 = {"flour", "sugar", "eggs", "milk", "butter"}
recipe2 = {"flour", "sugar", "eggs", "vanilla", "baking powder"}

common_ingredients = recipe1.intersection(recipe2)
unique_to_recipe1 = recipe1.difference(recipe2)
unique_to_recipe2 = recipe2.difference(recipe1)

print("Common ingredients:", common_ingredients)
print("Unique to recipe 1:", unique_to_recipe1)
print("Unique to recipe 2:", unique_to_recipe2)

all_ingredients = recipe1.union(recipe2)
print("All ingredients needed:", all_ingredients)

Slide 11: Results for: Real-life Example: Recipe Ingredient Comparison

Common ingredients: {'sugar', 'flour', 'eggs'}
Unique to recipe 1: {'milk', 'butter'}
Unique to recipe 2: {'baking powder', 'vanilla'}
All ingredients needed: {'sugar', 'flour', 'eggs', 'milk', 'butter', 'baking powder', 'vanilla'}

Slide 12: Set Performance

Sets in Python are implemented using hash tables, which provide constant-time average case complexity for add, remove, and lookup operations. This makes sets extremely efficient for large collections of unique elements.

import time

# Comparing performance of sets vs lists for membership testing
def performance_test(n):
    # Create a set and a list with n elements
    set_data = set(range(n))
    list_data = list(range(n))
    
    # Test set membership
    start_time = time.time()
    for i in range(n):
        i in set_data
    set_time = time.time() - start_time
    
    # Test list membership
    start_time = time.time()
    for i in range(n):
        i in list_data
    list_time = time.time() - start_time
    
    return set_time, list_time

n = 100000
set_time, list_time = performance_test(n)
print(f"Time for {n} lookups:")
print(f"Set: {set_time:.6f} seconds")
print(f"List: {list_time:.6f} seconds")
print(f"Set is {list_time / set_time:.2f}x faster")

Slide 13: Results for: Set Performance

Time for 100000 lookups:
Set: 0.010255 seconds
List: 4.757950 seconds
Set is 463.95x faster

Slide 14: Mathematical Applications of Sets

Sets in Python can be used to represent mathematical sets and perform set operations. Here's an example demonstrating the use of sets for solving a simple set theory problem.

# Define the universal set U and sets A, B, C
U = set(range(1, 21))  # Universal set: integers from 1 to 20
A = {x for x in U if x % 2 == 0}  # Even numbers
B = {x for x in U if x % 3 == 0}  # Multiples of 3
C = {x for x in U if x % 5 == 0}  # Multiples of 5

# Calculate (A ∪ B) ∩ C'
result = (A.union(B)).intersection(U.difference(C))

print("U =", U)
print("A =", A)
print("B =", B)
print("C =", C)
print("(A ∪ B) ∩ C' =", result)

# Verify the result using set comprehension
verified_result = {x for x in U if (x in A or x in B) and x not in C}
print("Verified result:", verified_result)
print("Results match:", result == verified_result)

Slide 15: Results for: Mathematical Applications of Sets

U = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
A = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
B = {3, 6, 9, 12, 15, 18}
C = {5, 10, 15, 20}
(A ∪ B) ∩ C' = {2, 3, 4, 6, 8, 9, 12, 14, 16, 18}
Verified result: {2, 3, 4, 6, 8, 9, 12, 14, 16, 18}
Results match: True

Slide 16: Additional Resources

For those interested in delving deeper into sets and their applications in Python, here are some recommended resources:

  1. Python's official documentation on sets: https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
  2. "Effective Python: 90 Specific Ways to Write Better Python" by Brett Slatkin - This book includes advanced techniques for working with sets and other Python data structures.
  3. "Python Cookbook" by David Beazley and Brian K. Jones - Offers practical recipes for solving problems using sets and other Python features.
  4. ArXiv paper on set theory and its applications: "Set Theory and Its Applications" by Akihiro Kanamori (https://arxiv.org/abs/math/0703356)

These resources provide a mix of practical Python programming techniques and theoretical foundations of set theory, which can enhance your understanding and usage of sets in Python.