# Learning Python Part-16: Python Sets along with Frozenset

Python sets are unordered collection of unique items unlike lists or tuples. Python sets are defined by values separated by comma inside curly braces {}. The sets are mutable so we can add or remove elements to/from it. However, elements in a set are not ordered.

Example:

a = {1, 2, 3, 4, 5}

print(a)                                     #### Output a = {5,2,3,1,4}
print(type(a))                            #### Output will be

Python sets eliminate the duplicates as shown in below example.

a = {1,2,2,3,3,3}
print(a)                                      ### Output will be {1, 2, 3}

Slicing operator [] does not work on set since they are unordered in nature.

Sets can be used to perform mathematical set operations like union, intersection, symmetric difference. A set can have any number of items and they may be of different types (integer, float, tuple, string etc).

But a set cannot have a mutable element, like list, set or dictionary, as its element.

# set of integers

s = {1, 2, 3}
print(s)

# set of mixed datatypes

s = {1.0, “Hello”, (1, 2, 3)}
print(s)

s = set([1,2,3,2])
print(s)

How to change a set in Python?

• Sets are mutable. But since they are unordered, indexing does not work with sets.
• We cannot access/change an element of set using indexing or slicing. Set does not support it.
• We can add single element using the add() method and multiple elements using the update() method.
• The update() method can take tuples, lists, strings or other sets as its argument as in examples below. However, in all cases duplicates are avoided.

s = {1,3}
print(s)

print(s)

s.update([2,3,4])
print(s)

s.update([4,5], {1,6,8})
print(s)

How to remove elements from a set?

• A particular item can be removed from set using methods like discard() and remove().
• The only difference between the two methods is that, while using discard() if the item does not exist in the set, it remains unchanged.
• But remove() will raise an error in such condition.

s = {1, 3, 4, 5, 6}

print(s)

s.remove(6)
print(s)

print(s)

• Similarly, we can remove and return an item using the pop() method.

print(s.pop())

• Be careful with pop(). Set being unordered, there is no way of determining which item will be popped. It is completely arbitrary.

s.pop()

• We can also remove all items from a set using clear().

s.clear()

Python Set Operations:

• Sets can be used to carry out mathematical set operations like union, intersection, difference and symmetric difference.
• We can do these operations using operators or methods.
• Set Union
• Set Intersection
• Set Difference
• Set Symmetric Difference
• Set Union: • Union of set A and set B is a set of all elements from both sets.
• Union is performed using ‘ | ‘ operator.
• Same can be accomplished using the method union().
• Example:
# initialize set A and set B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
print(A | B)                                   # use of | operator
# Output: {1, 2, 3, 4, 5, 6, 7, 8}
OR

print(A.union(B))            # Output:
{1, 2, 3, 4, 5, 6, 7, 8}

# or other way, use union function on B

print(B.union(A))
# Output: {1, 2, 3, 4, 5, 6, 7, 8}

• Set Intersection:

• Intersection of set A and set B is a set of elements that are common in both sets.
• Intersection is performed using ‘&‘ operator.
• Same can be accomplished using the method intersection().

# initialize A and B

A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

print(A & B)                                      # use & operator. # Output: {4, 5}

# use intersection function on A

print(A.intersection(B))                    # Output : {4, 5}

# Or use intersection function on B

print(B.intersection(A))                    # Output: {4, 5}

• Difference of set A & set B is a set of elements that are only in A but not in B or vice versa.
• ex: B – A is a set of element in B but not in A
• ex A – B is a set of element in A but not in B.
• Difference is performed using ‘‘ operator.
• Same can be accomplished using the method difference().

# initialize A and B

A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

print(A – B)                                         # use – operator on A # Output: {1, 2, 3}

# use difference function on A

print(A.difference(B))                         # Output:  {1, 2, 3}

# use – operator on B

print(B – A )                                         # Output: {8, 6, 7}

# use difference function on B

print(B.difference(A))                          # Output: {8, 6, 7}

• Set Symmetric Difference:

• Symmetric Difference of A and B is a set of elements in both A and B except those elements that are common in both.
• Symmetric difference is performed using ‘^‘ operator.
• Same can be accomplished using the method symmetric_difference().

# initialize A and B

A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

print(A ^ B)                                                # use ^ operator. # Output: {1, 2, 3, 6, 7, 8}

# use symmetric_difference function on A

print(A.symmetric_difference(B))              # Output:  {1, 2, 3, 6, 7, 8}

# use symmetric_difference function on B

print(B.symmetric_difference(A))               # Output:  {1, 2, 3, 6, 7, 8}

Different Python Set Methods:

Other Set Operations:

• Set Membership Test
• We can test if an item exists in a set or not, using the keyword in.

s = set(“apple”)
print(‘a’ in s)                    # Output: True
print(‘p’ not in s)              # Output: False

• Iterating Through a Set

for x in set(“apple”):
print(x)

Built-in Functions with Set:

Python Frozenset:
• Frozenset is a new class that has the characteristics of a set, but its elements cannot be changed once assigned.
• While tuples are immutable lists, frozensets are immutable sets.
• Sets being mutable are unhashable, so they can’t be used as dictionary keys.
• On the other hand, frozensets are hashable and can be used as keys to a dictionary.
• Frozenset supports methods like copy(), difference(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference() and union().
• Being immutable it does not have method that add or remove elements.
• Frozensets can be created using the frozenset() function.

# initialize A and B

A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])

print(A.isdisjoint(B))                             # Output:  False
print(A.difference(B))                            # Output:  frozenset({1, 2})

print(A | B)                                             # Output:  frozenset({1, 2, 3, 4, 5, 6})