In this tutorial , we will show how to use sets in python . We will start by explaining what is a set. After that we will explain how to use sets , so the various operations that we can perform , finally we will give some practical usage examples of a set . I will also provide a summary for the various operations that can be performed on a set .
Table of Contents
what is a set
A set in python is a sequence of unique unordered elements. hence it doesn’t contain any duplicate . We can perform mathematical operations on a set , such as membership testing , intersection union … This being said , we can use sets to remove duplicate from an iterable.
Sets are not subscriptable , hence we cannot access a set using the index operator [] , and we cannot perform slicing , or any operation that is dependent on being able to be indexed .
Sets are mutable , we can add and remove elements from a set , but a set cannot contain mutable elements such as a sequence or a dictionary , or a set.
Creating a set
We can create a set by using the set(iterable) notation or by using the literal
{element,} notation . The {} cannot be used to create an empty set
, as this used to create a dictionary.
>>> _set = set(['pen', 'pen', 'notebook'])
# create a set from an iterable
>>> print(f'_set : {_set}')
{'notebook', 'pen'}
all duplicate are removed
>>> _dict = {}
# {} is used to create an empty dictionary not an empty set
>>> print(type(_dict))
# <class 'dict'>
>>> _set = {1,2,3,1,2,3}
# create a set using {element ,}
>>> print(f'_set : {_set}')
_set : {1, 2, 3}
Adding elements to a set
we cannot alter an element in a set , since we cannot use the subscript operator , and there are no methods to change a specific element . We can add or remove elements to a set . To add elements , we use the set add method as follows :
>>> _set = {'cup', 'pen', 'ipad'}
# create a set
>>> _set
{'cup', 'pen', 'ipad'}
>>> _set.add('charger')
>>> _set
{'cup', 'pen', 'charger', 'ipad'}
>>> _set.add('phone')
>>> _set
{'cup', 'ipad', 'pen', 'phone', 'charger'}
Remove elements from a set
- we can remove an arbitrary element from a set using set.pop. set.pop will throw keyError if the set is empty , if it is not empty it will remove an return the element
- we can remove a specific element from a set using set.discard
- we can clear all the set elements using set.clear() method
>>> _set = set('removing elements from a set an example')
>>> _set
{'t', 'x', 'a', 'n', 'f', 'v', 'm', 'e', 'i', 'l', 'p', 'g', ' ', 's', 'r', 'o'}
# popping an arbitrary element from a set
>>> _set.pop()
'n'
>>> _set.pop()
'g'
#removing a specific element
>>> _set.discard('e')
>>> _set.discard('n')
# if the element doesn't exist discard does nothing
#clear all elements of a set
>>> _set.clear()
>>> _set
set()
Basic set operations
we can perform some basic set operations .

they are the union , the intersection , the difference , the symmetric difference (union – intersection )
>>> _setOne = {1, 2, 3, 4, 5}
>>> _setTwo = {4, 5, 6, 7, 8, 9}
# union
>>> _union = _setOne | _setTwo
>>> _union
{1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> _union = _setOne.union(_setTwo)
>>> _union
{1, 2, 3, 4, 5, 6, 7, 8, 9}
# intersection
>>> _intersection = _setOne & _setTwo
>>> _intersection
{4, 5}
>>> _intersection = _setOne.intersection(_setTwo)
>>> _intersection
{4, 5}
# subtraction
>>> _subtraction = _setOne - _setTwo
>>> _subtraction
{1, 2, 3}
>>> _subtraction = _setOne.difference(_setTwo)
>>> _subtraction
{1, 2, 3}
# symmetric difference union - intersection
>>> _symmetricDifference = _setOne ^ _setTwo
>>> _symmetricDifference
{1, 2, 3, 6, 7, 8, 9}
>>> _symmetricDifference = _setOne.symmetric_difference(_setTwo)
>>> _symmetricDifference
{1, 2, 3, 6, 7, 8, 9}
Sets Relationship
we can check if one set is a subset or superset of another . we can also check if two sets are disjoint hence they have no elements in common .
_setOne = {1, 2, 3, 4, 5}
_setTwo = {1, 2, 3, 4, 5, 6}
# check if a set is a subset of another
>>> _setOne.issubset(_setTwo)
True
>>> _setOne < _setTwo
True
>>> _setOne.issubset(_setOne)
True
>>> set().issubset(_setOne)
True
>>> set().issubset(set())
True
# check if a set is a superset of another
>>> _setTwo.issuperset(_setOne)
True
>>> _setTwo > _setOne
True
>>> _setTwo.issuperset(_setTwo)
True
>>> set().issuperset(_setOne)
False
>>> set().issuperset(set())
True
# check if two sets are disjoint
>>> _setOne.isdisjoint(_setTwo)
False
>>> {''}.isdisjoint(_setTwo)
True
#check if two sets are equal
>>> _setOne == _setTwo
False
#check if two sets don't have the same elements
>>> _setOne != _setTwo
True
Updating a set
we can update a set , so update the elements inside a set using :
- update (union update): calculate the union of set a and set b , and set the result to a
- intersection_update : calculate the intersection of a and b and set the result to a
- difference_update : remove the elements of set b from set a and set the result to a
- symmetric_difference_update : calculate the union minus the intersection of set a and b and set the result to a
>>> _setOne = {'a', 'b'}
>>> _setTwo = {'b', 'c', 'd'}
# update
>>> _setOne |= _setTwo
>>> _setOne
{'b', 'd', 'a', 'c'}
>>> _setOne = {'a', 'b'}
>>> _setOne.update(_setTwo)
>>> _setOne
{'b', 'd', 'a', 'c'}
# intersection update
>>> _setOne = {'a', 'b'}
>>> _setOne &= _setTwo
>>> _setOne
{'b'}
>>> _setOne = {'a', 'b'}
>>> _setOne.intersection_update(_setTwo)
>>> _setOne
{'b'}
# difference update
>>> _setOne = {'a', 'b'}
>>> _setOne -= _setTwo
>>> _setOne
{'a'}
>>> _setOne = {'a', 'b'}
>>> _setOne.difference_update(_setTwo)
>>> _setOne
{'a'}
# symmetric difference update
>>> _setOne = {'a', 'b'}
>>> _setOne ^= _setTwo
>>> _setOne
{'c', 'd', 'a'}
>>> _setOne = {'a', 'b'}
>>> _setOne.symmetric_difference_update(_setTwo)
>>> _setOne
{'c', 'd', 'a'}
Testing if an element is in a set
we can use the in operator to test if an element is inside a set
>>> _setOne = {1, 2, 3, 4}
>>> 1 in _setOne
True
>>> 'a' in _setOne
False
Looping and list comprehension
>>> _set = {'small cup', 'medium cup', 'large cup'}
>>> for _s in _set:
... print(_s)
...
medium cup
small cup
large cup
>>> _setOnlySmall = {_s for _s in _set if _s == 'small cup'}
>>> _setOnlySmall
{'small cup'}
Copying a set
>>> _setOne = {1, 2, 3, 4}
>>> _setTwo = _setOne.copy()
>>> _setOne == _setTwo
True
>>> _setOne
{1, 2, 3, 4}
Time Complexity
From python wiki

Practical examples about using sets
Purging data
Let us say we have some data , that we have gotten from a source , and that this data needs some purging .
For example we are doing the inventory , and we are not sure if the person who was doing the inventory made any error . As such we want to remove any duplicate data.
The data is in a file , and the names of the materials are separated by space . So we can represent this as having a string containing the name of the materials separated by a space .
>>> data = 'cup coffee charger phone phone cup coffee charger'
>>> dataPurged = set(data.split(' '))
>>> data
'cup coffee charger phone phone cup coffee charger'
>>> dataPurged
{'cup', 'coffee', 'charger', 'phone'}.
Checking if the letters of a string are contained within another one
Let us say we have an alphabet stored in a string , and we want to check if a word is formed from this alphabet , hence we can rephrase the problem into checking if the letters in this word are in the alphabet .
>>> alphabet = 'abcdefghijklmnopqrstuvwxyz' >>> word= 'wordverifyformedfromalphabet' >>> set(word)< set(alphabet) True
Set operations quick summary
- creation
- _set = set(iterable)
- _set = {element , } # cannot use {} without any element inside
- adding elements
- _set.add(element)
- removing elements
- _set.clear() #empty the set
- _set.pop() #remove an arbitrary element from a set , throw keyError if set empty
- _set.discard(element) # remove element from set , doesn’t return anything and doesn’t throw an error
- Basic set operations
-
_union = _setOne | _setTwo
-
_union = _setOne.union(_setTwo)
- _intersection = _setOne & _setTwo
- _intersection = _setOne.intersection(_setTwo)
- _symmetricDifference = _setOne ^ _setTwo # Union Minus Intersection
- _symmetricDifference = _setOne.symmetric_difference(_setTwo)
-
- Basic sets relationships
- _setOne.issubset(_setTwo)
- _setOne < setTwo # _setOne.issubset(_setTwo)
- _setTwo.issuperset(_setOne)
- _setOne > setTwo # _setTwo.issuperset(_setOne)
- _setOne.isdisjoint(_setTwo) # no elements in common
- _setOne == _setTwo # they have the same elements
- _setOne != _setTwo # they don’t have the same elements
- Updating a set
-
_setOne |= _setTwo # union update
-
_setOne.update(_setTwo) # union update
-
_setOne &= _setTwo # intersect update
-
_setOne.intersection_update(_setTwo) # intersect update
-
_setOne -= _setTwo #difference update
-
_setOne.difference_update(_setTwo) # difference update
-
_setOne ^= _setTwo # symmetric difference update
-
_setOne.symmetric_difference_update(_setTwo) # symmetric difference update
-
- Testing if an element is in a set
- elem in _setOne
- Looping and list comprehension
- for _s in _set : #do something #not in order
- {_s for _s in _set if _s is int} # not in order
- copying
- _setOne.copy() # creates a shallow copy
