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()