# Sets: unordered, mutable, no duplicates
myset = {1, 2, 3, 4, 5}
print(myset)

# Set does not allow duplicate
myset = {1, 2, 1, 4, 2, 1}
print(myset)
# o/p: {1, 2, 4}

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

myset = set("Hello")
print(myset)

myset = set()
print(type(myset))

# Adding elements to a set
myset.add(1)
myset.add(2)
myset.add(3)
print(myset)

# Removing elements from a set
myset.remove(3)
print(myset)

myset.discard(2)
print(myset)

# To empty a set
myset.clear()
print(myset)

myset = {1, 2, 3}
print(myset.pop())
print(myset)

# Union and intersection of sets
odds = {1, 3, 5, 7, 9}
evens = {0, 2, 4, 6, 8}
primes = {2, 3, 5, 7}

u = odds.union(evens)
print(u)

u = odds.union(primes)
print(u)

i = odds.intersection(evens)
print(i)

i = odds.intersection(primes)
print(i)

# Difference of two sets
setA = {1, 2, 3, 4, 5, 6, 7, 8, 9}
setB = {1, 2, 3, 10, 11, 12}

diff = setA.difference(setB)
print(diff)
# o/p: {4, 5, 6, 7, 8, 9}

diff = setB.difference(setA)
print(diff)
# o/p: {10, 11, 12}

diff = setB.symmetric_difference(setA)
print(diff)
# o/p: {4, 5, 6, 7, 8, 9, 10, 11, 12}

setA.update(setB)
print(setA)
# o/p: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

setA.intersection_update(setB)
print(setA)
# o/p: {1, 2, 3}

# Subset, superset and disjoint sets:
setA = {1, 2, 3, 4, 5, 6}
setB = {1, 2, 3}
setC = {0, 10, 9}

print(setA.issubset(setB))
# o/p: False
print(setB.issubset(setA))
# o/p: True
print(setA.issuperset(setB))
# o/p: True
print(setB.issuperset(setA))
# o/p: False
print(setA.isdisjoint(setB))
# o/p: False
print(setA.isdisjoint(setC))
# o/p: True

# Frozenset
a = frozenset([1, 2, 3, 4])
a.add(2)
print(a)
# any update methods wont work on a frozenset except for union, intersection methods!