# SET and FROZENSET

## What is a set ?

A set is a finite collection of unique elements.

Set is also a sequence, and it is iterable.

Unlike list or tuple, set can not have duplicate values.

set is an un-ordered collection of object.

A set is mutable; we can add, modify and delete elements from a set.

## How to create a set ?

Method 1:

A set is created by using **set(**iterable**)** constructor function.

set() creates an empty set

empty_set = set()

set can also be created by iterable object.

Example :

creating a set from iterable, list or tuple

list_numbers = [1,2,3,4,5,2,3,4]

tuple_numbers = 10,20,30,40,50,10,30,50

#creating a set with list set_num_1 = set(list_numbers)

output:

#note duplicates are removed >>> set_num_1 {1, 2, 3, 4, 5}

#creating a set with tuple set_num_2 = set(tuple_numbers)

output:

#note duplicates are removed >>> set_num_2 {40, 10, 50, 20, 30}

Method 2:

We can also Create a set with **‘{}’** curly brackets.

>> a = {1,2,3,4,5,12,3,4} #contains duplicate while defining

#check the contents of the set, >>> a {1, 2, 3, 4, 5, 12} # actual set doesn't contain duplicates

### set() is an un-ordered collection.

Python internally optimizes the order of the elements.

#Notice the order while defining and accessing.

Ex 1.

>>> a = {4,5,6,1,2,4,5,56,23,6,11} >>> a {1, 2, 4, 5, 6, 11, 23, 56}

Ex 2.

>>> b = {33,4,2,55,6,1,2,22,18,900} >>> b {33, 2, 1, 4, 900, 6, 18, 22, 55}

### set can contain different types of immutable objects.

In this example mixed_set contain, integer, float, string, tuple

Example:

>>> mixed_set = {1,1.0, "string",(110,20,30)}

#check the contents of the set >>> mixed_set {1, (110, 20, 30), 'string'}

## Built-in functions on sets

Lets look at how to use some built-in functions on Python.

Here the few built-in functions we are going to apply on sets.

help(),dir(), len(), min(), max(), sum(), sorted().

### help()

More information on set() implementation

### dir(set)

Lists the names in current scope comprising attributes of set.

### len(set)

Returns number of items in set.

Example :

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

>>> len(a)

output:

5

### min(set)

Returns minimum value of the set.

>>> min(a) 1

### max(set)

Returns maximum value of the set.

>>> max(a) 5

### sum()

Returns sum of all the elements if items are numbers.

Ex 1:

>>> sum(a) 15

Ex 2:

For set with strings sum() throws TypeError, as doesn’t make sense to get a sum of strings.

Lets check that.

We have str_set with element type as strings.

>>> str_set = {'one', 'two','three','four'}

>>> str_set {'two', 'one', 'four', 'three'}

#check sum function on set.

>> sum(str_set)

ouput:

Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' >>>

### sorted(set)

Returns a copy of sorted set, if set is not empty.

Otherwise returns an empty list.

Here we have un sorted set of numbers.

>>> assorted = {4,3,3,5,6,7,8,19,2,0,33} >>> assorted {0, 33, 2, 3, 4, 5, 6, 7, 8, 19}

Now get a copy of the sorted set

>>> sorted(assorted) [0, 2, 3, 4, 5, 6, 7, 8, 19, 33]

#check the original set is not changed, as sorted() returns a copy of sorted set.

>>> assorted {0, 33, 2, 3, 4, 5, 6, 7, 8, 19}

## set operations and set methods.

We have multiple set operation to cover,

Lets consider two sets a, b as below.

>>> a = {1,2,3,4} >>> b = {10, 9,5,2,7,5,3,6}

>>> a {1, 2, 3, 4} >>> b {2, 3, 5, 6, 7, 9, 10}

### set() is mutable collection

#1. Add an element to set

### add(elem)

Adds an element to the set.

If the object already present in the set nothing happens.

Ex 1.

>>> a.add(5) >>> a {1, 2, 3, 4, 5}

Ex 2.

#trying to add 5 again >>> a.add(5) >>> a {1, 2, 3, 4, 5}

### remove(elem)

If elem is present in the set, removes it from the set.

raises a KeyError otherwise.

>>> a.remove(3) >>> a {1, 2, 4}

If you try to remove the element which is not present a KeyError is raised.

Lets try to remove element 3, which we have already removed above.

>>> a.remove(3)

ouput:

Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 3

### discard(elem)

Removes the elem from the list,if present. Otherwise does nothing.

Similar to remove(), but doesn’t raise error if the element is not present.

a = {1, 2, 3, 4}

#discard element 3 from the set.

>> a.discard(3)

#check the contents

>>> a {1, 2, 4}

#try again to discard the element which is not present

>> a.discard(3)

Notice nothing happens.

### clear()

Removes all the elements from the list.

if set is empty does nothing.

a = {1, 2, 3, 4}

>>> a.clear()

#check the contents of the set, it should be an empty set.

>>> a set()

Set in Python is similar to mathematical set,

we can do all set operation like in maths.

Few examples are as below.

### union of sets

Union of sets contains all the elements of sets.

**‘|’** pipe symbol is used to get union.

>>> a = {1,2,3,4} >>> b = {10, 9,5,2,7,5,3,6}

>>> a | b {1, 2, 3, 4, 5, 6, 7, 9, 10} >>>

We can use set method union to get a union of sets.

### union(set)

Same as a | b.

a.union(b)

>>> a.union(b) {1, 2, 3, 4, 5, 6, 7, 9, 10}

### intersection of sets

Intersection is a set containing common elements of both sets.

**‘&’** symbol is used to get intersection.

>>> a & b {2, 3} >>> b & a {2, 3}

set method intersection() gives the same result as below

### intersection(set)

>>> a.intersection(b) {2, 3} >>> b.intersection(a) {2, 3}

### difference of sets.

Difference set contains, left-hand set with all elements from the right-hand

set removed.

**‘-‘** is used to difference of sets.

>>> a {1, 2, 3, 4} >>> b {2, 3, 5, 6, 7, 9, 10} >>> a -b {1, 4} >>> b - a {5, 6, 7, 9, 10}

### symmetric difference.

The resulting set has elements which are unique to each set

**‘^’** is get the symmetric difference.

>>> a ^ b {1, 4, 5, 6, 7, 9, 10} >>> b ^ a {1, 4, 5, 6, 7, 9, 10}

### copy()

Returns a shallow copy of a set.

>>> a = {1,2,3,4} >>> c = a.copy() >>> c {1, 2, 3, 4}

### issubset(superset)

Returns True if the set is subset of super-set, otherwise False.

we have two sets here a and ss.

>>> a = {1,2,3,4} >>> ss = {2,3} >>> ss.issubset(a) True

another set ss1 which contains different elements.

>>> ss1 = {6,7} >>> ss1.issubset(a) False

### issuperset(subset)

Returns True if the set is super-set of subset, otherwise False.

>>> a.issuperset(ss) True >>> a.issuperset(ss1) False

### Set Comparison Operators

All of the standard comparisons (‘<’, ‘<=’, ‘>’, ‘>=’, ‘==’, ‘!=’, in, not in) work with sets.

## FROZENSET

### What is a forzenset ?

frozenset is an immutable set.

Like set Its an un-ordered collection of unique elements.

As frozenset is immutable, we cannot add, modify or delete elements.

### How to create a frozenset ?

frozenset is created by using a frozenset() built-in funciton.

Create an empty frozenset.

fs = frozenset()

#check the type

>>> type(fs)

<class ‘frozenset’>

Like set we can create frozenset from an iterable object.

### creating a frozenset form an iterable object.

Ex 1:

#creating frozenset from tuple fs1 = frozenset((0,1,1,2,3,2,3,4,5)) >>> fs1 frozenset({0, 1, 2, 3, 4, 5})

Ex 2:

#creating frozenset from list >>> nums = [0,1,1,2,3,2,3,4,5] >>> fs1 = frozenset(nums) >>> fs1 frozenset({0, 1, 2, 3, 4, 5})

As frozenset is immutable, don’t have add(),remove(),clear(),discard() methods.

We can do all other set operation on frozenset.

Thats covers the basics of sets and fronzensets.