*Even if you're just starting your Python journey, you've most likely come across Python sets. But do you know how to use them effectively? This article aims to cover all the main Python set operations to give you a better feel for when and how to use this important data structure.*

### What Are Python Sets?

First, let's start with the basics. A set is a built-in type in Python that has a number of important characteristics:

**Sets are unordered.**In other words, the items are inserted in random order, so you can't access elements using indices.**Sets include only unique elements.**No duplicates are allowed in sets.**A set is mutable.**A set can be modified, and it's possible to add and remove items from one.**Elements of a set must be of an immutable type.**For example, strings, integers, floats, and tuples are acceptable types for a set.**A set may include elements of different types.**For example, you can include a mix of numbers, strings, and tuples in one set.

Now it's time to see how to define and modify Python sets.

### Creating and Changing a Set in Python

#### Creating sets

There are two ways to create a set: you can use the built-in

or, alternatively, define a set with **set() function****curly braces**. Here are some examples:

# Creating sets using built-in function set_one = set((0, "one", (2, 3, 4))) set_one

{(2, 3, 4), 0, 'one'}

# Creating sets using built-in function set_two = set("Game of Thrones") set_two

{' ', 'G', 'T', 'a', 'e', 'f', 'h', 'm', 'n', 'o', 'r', 's'}

# Creating sets using curly braces set_three = {0, "one", (2, 3, 4)} set_three

{(2, 3, 4), 0, 'one'}

# Creating sets using curly braces set_four = {"Game of Thrones"} set_four

{'Game of Thrones'}

The argument to the `set() function`

needs to be **an iterable** that generates a list of objects (e.g., tuples, lists, strings); these will be inserted into the set. On the other hand, if you use curly braces, the objects themselves are placed manually. So you've probably spotted the difference in applying these two approaches:

- We pass in a tuple to the
`set()`

function to create`set_one`

, but we place the objects directly into the curly braces to get`set_three`

with the same elements. - The
`set()`

function treats the string that we pass in to create`set_two`

as an iterable, and so the resulting set is a collection of letters from this string, while curly braces treat a string as a distinct element of the set and so we get`set_four`

with this string as the only member.

Also, note that the resulting sets are unordered, and duplicate values are only represented in the set once (as with the letter 'e' in the second example).

#### Checking set size and membership

You can use the

function to check the number of elements in a set, and you can also check if a particular element exists or doesn't exist in a set using the **len()**

or **in**

operators, respectively.**not in**

# Checking the number of elements in a set len(set_one)

3

# Checking if an element is in a set 0 in set_one

True

# Checking if an element is not in a set 0 not in set_one

False

#### Adding elements to a set

You can use the

method to insert a single element into a set. If you'd like to insert multiple objects into a set at once, use the **add**()

method. Here are some examples:**update()**

# Adding a single element using add() method my_set = {'a', 'b', 'c'} my_set.add('d') my_set

{'a', 'b', 'c', 'd'}

# Adding multiple elements using update() method my_set.update('e', 'f', 'g', 'b') my_set

{'a', 'b', 'c', 'd', 'e', 'f', 'g'}

# Adding multiple elements of different types (i.e., adding a tuple and another set) my_set.update(('a', 'h'), {'c', 'i', 'j'}) my_set

{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}

#### Removing elements from a set

There are a number of ways to remove items from a set:

- Use the

method if you want to remove a single element from a set, or get an error message if the respective item is not in the set.**remove()** - Use the

method if you want to remove a single element from a set but don't need an error message if the given item is not in the set.**discard()** - Use the

method to remove and return a random element from a set.**pop()** - Use the

method to remove all items from a set.**clear()**

We'll see later how you can remove multiple elements from a set without using a loop.

# Using remove() to remove an item that doesn't exist in a set my_set.remove('o') my_set

--------------------------------------------------------------------------- KeyError Traceback (most recent call last)in () 1 # Using remove() to remove an item that doesn't exist in a set ----> 2 my_set.remove('o') 3 my_set KeyError: 'o'

# Using discard() to remove an item that doesn't exist in a set my_set.discard('o') my_set

{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}

# Using pop() to remove and return a random element print(my_set.pop()) print(my_set)

j {'d', 'b', 'e', 'c', 'a', 'i', 'h', 'g', 'f'}

# Using clear() to remove all elements from a set my_set.clear() my_set

set()

These are the basic methods you can use to modify a set. Let's now move on to some more advanced Python set operations and methods.

### Python Set Operations and Methods

We can use Python sets to carry out mathematical set operations like **union**, **intersection**, **difference**, and **symmetric difference**. These operations can be performed using either operators or methods.

However, there is one important difference between these two approaches: operators can work only with sets, while methods accept any iterable (e.g., lists, tuples) as an argument, convert it to a set, and then perform the operation.

Don't worry if this is not clear to you yet—we'll look at some examples below.

#### Set Union

If there are two sets, `first_set`

and `second_set`

, the union of these two sets is the set of **all elements from both sets**. You can get a union of two sets using the `union()`

method or the `|`

operator. However, if you want to get a union of a set and a list, the `|`

operator is not going to work, and you will need to use the `union()`

method.

# Initializing sets first_set = {1, 3, 5, 7, 9} second_set = {2, 4, 6, 8, 10}

# Set union using | operator first_set | second_set

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

# Set union using union() method first_set.union(second_set)

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

# Getting a union of a set and a list first_set.union([2, 4, 6, 8, 10])

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

#### Set Intersection

The intersection of two sets, `first_set`

and `second_set`

, is the set of all **elements common to both sets**. This operation can be performed using the & operator or the `intersection()`

method.

# Initializing sets first_set = {1, 2, 3, 4, 5} second_set = {4, 5, 6, 7, 8} third_set = {4, 5, 9, 10}

# Performing intersection using & operator first_set & second_set & third_set

{4, 5}

# Performing inteesection using intersection() method first_set.intersection(second_set, third_set)

{4, 5}

As you can see, both the `intersection()`

method and the & operator allow you to create an intersection for more than two sets. Note that this applies not only to set intersections but also to other operations.

#### Set Difference

The difference of `first_set`

and `second_set`

is the set of all **elements that are only in** **first_set****and not in**

. You can create the difference of two sets using either the – operator or the **second_set**`difference()`

method.

# Initializing sets first_set = {1, 2, 3, 4, 5} second_set = {4, 5, 6, 7, 8}

# Performing difference using - operator print(first_set - second_set) print(second_set - first_set)

{1, 2, 3} {8, 6, 7}

# Performing difference using difference() method print(first_set.difference(second_set)) print(second_set.difference(first_set))

{1, 2, 3} {8, 6, 7}

As you can see from the examples, the order of the sets matters when performing the set difference operation.

#### Set Symmetric Difference

The symmetric difference operation allows you to get the **elements that are either in first_set or in second_set but not in both**. Again, you have two options for performing this operation: the

`symmetric_difference()`

method or the `^`

operator.# Initializing sets first_set = {1, 2, 3, 4, 5} second_set = {4, 5, 6, 7, 8}

# Performing symmetric difference using ^ operator first_set^second_set

{1, 2, 3, 6, 7, 8}

# Performing symmetric difference using symmetric_difference() method first_set.symmetric_difference(second_set)

{1, 2, 3, 6, 7, 8}

#### Update operations

Each of the operations we discussed above (union, intersection, difference, and symmetric difference) can be also used to **update a set**. We just need to use an augmented assignment form for the operators (|=, &=, -=, ^=), or the corresponding methods `update()`

, `intersection_update()`

, `difference_update()`

, and `symmetric_difference_update()`

). Here are some examples:

# Initializing sets first_set = {1, 2, 3, 4, 5} second_set = {4, 5, 6, 7, 8}

# Modifying a set by union using update() method first_set.update(second_set) first_set

{1, 2, 3, 4, 5, 6, 7, 8}

# Modifying a set by intersection using an operator first_set &= second_set first_set

{4, 5, 6, 7, 8}

# Modifying a set by difference using difference_update() method first_set.difference_update((6, 7, 8)) first_set

{4, 5}

# Modifying a set by symmetric difference using an operator first_set ^= second_set first_set

{6, 7, 8}

Notice how we were able to remove multiple elements from `first_set`

by specifying the elements we wanted to remove in a tuple that we passed in as an argument to the `difference_update()`

method.

#### Other set methods

Let's briefly review some methods that will help you to determine how sets relate to each other:

returns true if two sets have any elements in common.**isdisjoint()**

or the**issubset()**`<=`

operator returns true if the first set is a subset of the second one.

or the**issuperset()**`>=`

operator returns true if the first set contains every element of the second one.

### Python frozenset

If you've ever attempted to use set elements as dictionary keys, you know that this doesn't work because **sets are mutable and thus unhashable**. Luckily, Python has another built-in type named `frozenset`

that has all the properties of a set but is immutable. **Frozensets are hashable** and are accepted as keys to a dictionary. Check out the Python Basics. Part 2 course for more info on creating dictionaries.

You can create a frozenset using the

function. Being immutable, a frozenset doesn't have methods for adding or removing elements. However, update operations do work with frozensets. That's because these operations do not modify the original set but rather assign the set to a new object.**frozenset()**

### Wrap up

Now you know how to define a set object in Python, how to modify a set, and what kinds of operations can be performed with sets. You also know the main characteristics of Python sets and should have a better feeling for when a set is an appropriate choice.

All you need now is some practice! Check out the Python Basics. Part 3 course for a number of interactive exercises that cover sets, tuples, and date/time objects.

In case you also need a refresher on lists, dictionaries, and text files, Python Basics. Part 2 will provide you with easy-to-understand explanations and lots of hands-on exercises.