Python Sets: In this tutorial, you’ll learn everything about Python sets; how they are made, including or expelling components from them, and all activities performed on sets in Python.

A set is an unordered collection of items. Each set component is one of a kind (no duplicates ) and should be permanent (can’t be changed).

Be that as it may, a set itself is variable. We can include or expel things from it.

Sets can also be used to perform mathematical set operations like union, intersection, symmetric difference, etc.

## Making Python Sets

A set is made by setting all the things (components) inside wavy supports {}, isolated by comma, or by utilizing the inherent set() work.

It can have any number of things and they might be of various sorts (the whole number, skim, tuple, string, etc.). But a set cannot have mutable elements like lists, sets, or dictionaries as its elements.

```# Different types of sets in Python
# set of integers
my_set = {1, 2, 3}
print(my_set)

# set of mixed datatypes
my_set = {1.0, "Hello", (1, 2, 3)}
print(my_set)```

Output

```{1, 2, 3}
{1.0, (1, 2, 3), 'Hello'}```

Try the following examples as well.

```# set cannot have duplicates
# Output: {1, 2, 3, 4}
my_set = {1, 2, 3, 4, 3, 2}
print(my_set)

# we can make set from a list
# Output: {1, 2, 3}
my_set = set([1, 2, 3, 2])
print(my_set)

# set cannot have mutable items
# here [3, 4] is a mutable list
# this will cause an error.

my_set = {1, 2, [3, 4]}```

Output

```{1, 2, 3, 4}
{1, 2, 3}
Traceback (most recent call last):
File "<string>", line 15, in <module>
my_set = {1, 2, [3, 4]}
TypeError: unhashable type: 'list'```

## Creating an empty set is a bit tricky.

Empty curly braces {} will make an empty dictionary in Python. To make a set without any elements, we use the set() function without any argument.

```# Distinguish set and dictionary while creating empty set

# initialize a with {}
a = {}

# check data type of a
print(type(a))

# initialize a with set()
a = set()

# check data type of a
print(type(a))```

Output

```<class 'dict'>
<class 'set'>```

## Modifying a set in Python

Sets are impermanent. In any case, since they are unordered, the order has no significance.

We can’t access or change a component of a set utilizing ordering or cutting. Set information type doesn’t bolster it.

We can include a solitary component using the add() method, and various components using the update() technique. The update() technique can take tuples, records, strings, or different sets as its argument. In all cases, duplicates are avoided.

``````# initialize my_set
my_set = {1, 3}
print(my_set)

# if you uncomment line 9,
# you will get an error
# TypeError: 'set' object does not support indexing

# my_set

# Output: {1, 2, 3}
print(my_set)

# Output: {1, 2, 3, 4}
my_set.update([2, 3, 4])
print(my_set)

# Output: {1, 2, 3, 4, 5, 6, 8}
my_set.update([4, 5], {1, 6, 8})
print(my_set)``````
Output
```{1, 3}
{1, 2, 3}
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 8}```

## Removing elements from a set

A particular item can be expelled from a set using the methods discard() and remove().

The main contrast between the two is that the discard() work leaves a set unaltered if the component is absent in the set. Then again, the remove() capacity will bring a blunder up in such a condition (if element is absent in the set).

The following example will illustrate this.

```# Difference between discard() and remove()

# initialize my_set
my_set = {1, 3, 4, 5, 6}
print(my_set)

# Output: {1, 3, 5, 6}
print(my_set)

# remove an element
# Output: {1, 3, 5}
my_set.remove(6)
print(my_set)

# not present in my_set
# Output: {1, 3, 5}
print(my_set)

# remove an element
# not present in my_set
# you will get an error.
# Output: KeyError

my_set.remove(2)```

Output

```{1, 3, 4, 5, 6}
{1, 3, 5, 6}
{1, 3, 5}
{1, 3, 5}
Traceback (most recent call last):
File "<string>", line 28, in <module>
KeyError: 2

```

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

Since the set is an unordered data type, there is no way of determining which item will be popped. It is completely arbitrary.

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

```# initialize my_set
# Output: set of unique elements
my_set = set("HelloWorld")
print(my_set)

# pop an element
# Output: random element
print(my_set.pop())

# pop another element
my_set.pop()
print(my_set)

# clear my_set
# Output: set()
my_set.clear()
print(my_set)

print(my_set)```

Output

```{'H', 'l', 'r', 'W', 'o', 'd', 'e'}
H
{'r', 'W', 'o', 'd', 'e'}
set()```

## Python Set Operations

Sets can be used to complete scientific set activities like union, crossing point, contrast, and symmetric distinction. We can do this with administrators or methods.

Let us consider the following two sets for the following operations.

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

## Set Union

Union of A and B is a set of all elements from both sets.

The union is performed using | operator. The same can be accomplished using the union() method.

```# Set union method
# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# use | operator
# Output: {1, 2, 3, 4, 5, 6, 7, 8}
print(A | B)```

Output

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

Try the following examples on Python shell.

```# use union function
>>> A.union(B)
{1, 2, 3, 4, 5, 6, 7, 8}

# use union function on B
>>> B.union(A)
{1, 2, 3, 4, 5, 6, 7, 8}```

## Set Intersection

The intersection of A and B is a set of elements that are common in both sets.

The intersection is performed using & operator. The same can be accomplished using the intersection() method.

```# Intersection of sets
# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

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

Output

```{4, 5}

```

Try the following examples on Python shell.

```# use intersection function on A
>>> A.intersection(B)
{4, 5}

# use intersection function on B
>>> B.intersection(A)
{4, 5}```

## Set Difference

The difference of the set B from set A(A – B) is a set of elements that are only in A but not in B. Similarly, B – A is a set of elements in B but not in A.

The difference is performed using – operator. The same can be accomplished using the difference() method.

```# Difference of two sets
# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

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

Output

`{1, 2, 3}`

Try the following examples on Python shell.

```# use difference function on A
>>> A.difference(B)
{1, 2, 3}

# use - operator on B
>>> B - A
{8, 6, 7}

# use difference function on B
>>> B.difference(A)
{8, 6, 7}```

## Set Symmetric Difference

Symmetric Difference of A and B is a set of elements in A and B but not in both (excluding the intersection).

The symmetric difference is performed using ^ operator. The same can be accomplished using the method symmetric_difference().

```# Symmetric difference of two sets
# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

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

Output

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

Try the following examples on Python shell.

```# use symmetric_difference function on A
>>> A.symmetric_difference(B)
{1, 2, 3, 6, 7, 8}

# use symmetric_difference function on B
>>> B.symmetric_difference(A)
{1, 2, 3, 6, 7, 8}```

## Other Python Set Methods

There are many set methods, some of which we have already used above. Here is a list of all the methods that are available with the set objects:

## Other Set Operations

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

```# in keyword in a set
# initialize my_set
my_set = set("apple")

# check if 'a' is present
# Output: True
print('a' in my_set)

# check if 'p' is present
# Output: False
print('p' not in my_set)```

Output

```True
False```

## Iterating Through a Set

We can iterate through each item in a set using a for a loop.

```>>> for letter in set("apple"):
...     print(letter)
...
a
p
e
l```

## Built-in Functions with Set

Built-in functions like all(), any(), enumerate(), len(), max(), min(), sorted(), sum() etc. are commonly used with sets to perform different tasks.

## Python Frozenset

Frozenset is another class that has the attributes of a set, however, its components can’t be changed once doled out. While tuples are unchanging records, frozen sets are permanent sets.

Sets being variable are unhashable, so they can’t be used as word reference keys. Then again, frozensets are hashable and can be used as keys to a word reference.

Frozensets can be made using the frozenset() function.

This data type supports methods like copy(), difference(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference() and union(). Being immutable, it does not have methods that add or remove elements.

```# Frozensets
# initialize A and B
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])```

Try these examples on Python shell.

```>>> A.isdisjoint(B)
False
>>> A.difference(B)
frozenset({1, 2})
>>> A | B
frozenset({1, 2, 3, 4, 5, 6})  