Python Sets

Python comes equipped with several built-in data types to help us organize our data. These structures include lists, dictionaries, tuples and sets.

From the Python 3 documentation

A set is an unordered collection with no duplicate elements. Basic uses include membership testing and eliminating duplicate entries.

Read Python Sets: What, Why and How for a more in-deep reference.

Initializing a set

There are two ways to create sets: using curly braces {} and the built-in function set()

Empty Sets

When creating set, be sure to not use empty curly braces {} or you will get an empty dictionary instead.

# Create set using curly braces or set() function
s = {1, 2, 3}  # Using curly braces
s = set([1, 2, 3])  # Using set() constructor

# Warning: empty {} creates a dictionary, not a set
s = {}  # this will create a dictionary instead of a set
type(s)  # Returns <class 'dict'>
<class 'dict'>

Unordered collections of unique elements

A set automatically removes all the duplicate values.

# Sets automatically remove duplicates
s = {1, 2, 3, 2, 3, 4}  # Duplicates are removed
s  # Returns {1, 2, 3, 4}
{1, 2, 3, 4}
Quiz

Sign in to answer this quiz and track your learning progress

What happens when you create a set with duplicate values?
A. Duplicates are automatically removed
B. An error is raised
C. The set keeps all duplicates
D. Only the first occurrence is kept

And as an unordered data type, they can’t be indexed.

s = {1, 2, 3}
s[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing

set add and update

Using the add() method we can add a single element to the set.

# add() method: add a single element to the set
s = {1, 2, 3}
s.add(4)  # Add element 4
s
{1, 2, 3, 4}

And with update(), multiple ones:

# update() method: add multiple elements from an iterable
s = {1, 2, 3}
s.update([2, 3, 4, 5, 6])  # Add multiple elements (duplicates ignored)
s
{1, 2, 3, 4, 5, 6}

set remove and discard

Both methods will remove an element from the set, but remove() will raise a key error if the value doesn’t exist.

# remove() method: remove element, raises KeyError if not found
s = {1, 2, 3}
s.remove(3)  # Remove element 3
s
{1, 2}
s.remove(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 3

discard() won’t raise any errors.

# discard() method: remove element, no error if not found
s = {1, 2, 3}
s.discard(3)  # Remove element 3 (safe, no error if missing)
s
{1, 2}
s.discard(3)
Quiz

Sign in to answer this quiz and track your learning progress

What is the difference between remove() and discard() methods for sets?
A. remove() removes one element, discard() removes all
B. There is no difference
C. remove() raises an error if element doesn't exist, discard() does not
D. remove() is faster

set union

union() or | will create a new set with all the elements from the sets provided.

# union(): combine all elements from multiple sets (no duplicates)
s1 = {1, 2, 3}
s2 = {3, 4, 5}
s1.union(s2)  # or 's1 | s2' - returns {1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}

set intersection

intersection() or & will return a set with only the elements that are common to all of them.

# intersection(): return elements common to all sets
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {3, 4, 5}
s1.intersection(s2, s3)  # or 's1 & s2 & s3' - returns {3}
{3}
Quiz

Sign in to answer this quiz and track your learning progress

What does intersection() return for sets?
A. All elements from all sets
B. Only elements that are common to all sets
C. Elements in the first set but not in others
D. Elements in either set but not both

set difference

difference() or - will return only the elements that are unique to the first set (invoked set).

# difference(): return elements in first set but not in others
s1 = {1, 2, 3}
s2 = {2, 3, 4}

s1.difference(s2)  # or 's1 - s2' - returns {1}
{1}
s2.difference(s1) # or 's2 - s1'
{4}

set symmetric_difference

symmetric_difference() or ^ will return all the elements that are not common between them.

# symmetric_difference(): return elements in either set, but not both
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1.symmetric_difference(s2)  # or 's1 ^ s2' - returns {1, 4}
{1, 4}
Quiz

Sign in to answer this quiz and track your learning progress

What does symmetric_difference() return for two sets?
A. All elements from both sets
B. Only elements common to both sets
C. Elements in the first set but not in the second
D. Elements in either set, but not in both