import string # импортируем модуль работы со строками """http://aspn.activestate.com/ASPN/Python/Cookbook/Recipe/ 52258 Приводится в адаптированном виде с любезного разрешения автора Томаса Хеллера (Thomas Heller) """ class Set: """Класс множество""" def __init__(self, seq=None): """Инициализация множества""" self._dict = {} # инициализируем словарь self.extend(seq or []) def extend(self, seq): """Добавление элементов""" map(self.add, seq) def add(self, item): """Добавление одного элемента""" self._dict[item] = 1 def remove(self, item): """Удаление элемента""" if item in self: del self._dict[item] def __contains__(self, item): """Проверяем, находится ли элемент в множестве""" return self._dict.has_key(item) def __getitem__(self, index): """Для цикла for по элементам множества""" return self._dict.keys()[index] def __len__(self): """Размер множества""" return len(self._dict) def items(self): """Список элементов множества""" return self._dict.keys() def __add__(self, other): """Объединение двух множеств по синтаксису A+B """ new_set = self.__class__(self) new_set.extend(other) return new_set __radd__ = __add__ # то же, но для правой позиции экземпляра Set def __mul__(self, other): """Пересечение двух множеств по синтаксису A*B """ return self.__class__(filter(self.__contains__, other)) __rmul__ = __mul__ # то же, но для правой позиции экземпляра Set def __repr__(self): """Представление множества""" return "%s([%s])" % (self.__class__.__name__, string.join(map(repr, self._dict.keys()), ?, ?)) def __str__(self): """Представление множества (для человека)""" return "{%s}" % (string.join(map(str, self._dict.keys()), ?, ?)) def test(): A = Set([1, 2, 3]) B = Set([2, 3, 4, 5]) C = A + B # между собой D = C * [1, 5] # со списками print "A:", A, "B:", B, "C:", C, "D:", D print "[1, 2, 8] + A - B:", for i in [1, 2, 8]+A: if i not in B: print i, if __name__ == "__main__": test()