# 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!