class Set(list):
    def __init__(self, value = []):      # Konstruktor
        list.__init__(self)              # Dostosowuje listę do własnych potrzeb
        self.concat(value)               # Kopiuje zmienne wartości domyślne

    def intersect(self, other):          # other to dowolny obiekt iterowalny
        res = []                         # self to podmiot
        for x in self:
            if x in other:               # Wybór wspólnych elementów
                res.append(x)
        return Set(res)                  # Zwrócenie nowej instancji Set

    def union(self, other):              # other to dowolny obiekt iterowalny
        res = Set(self)                  # Kopia mojej listy
        res.concat(other)
        return res

    def concat(self, value):             # value: list, Set, itd.
        for x in value:                  # Usuwa duplikaty
            if not x in self:
                self.append(x)

    def __and__(self, other): return self.intersect(other)
    def __or__(self, other):  return self.union(other)
    def __repr__(self):       return f'Zbiór({list.__repr__(self)})'

if __name__ == '__main__':
    x = Set([1, 3, 5, 7])
    y = Set([2, 1, 4, 5, 6])
    print(x, y, len(x))
    print(x.intersect(y), y.union(x))
    print(x & y, x | y)
    x.reverse(); print(x)

