_set.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. class set:
  2. def __init__(self, iterable=None):
  3. iterable = iterable or []
  4. self._a = {}
  5. self.update(iterable)
  6. def add(self, elem):
  7. self._a[elem] = None
  8. def discard(self, elem):
  9. self._a.pop(elem, None)
  10. def remove(self, elem):
  11. del self._a[elem]
  12. def clear(self):
  13. self._a.clear()
  14. def update(self, other):
  15. for elem in other:
  16. self.add(elem)
  17. def __len__(self):
  18. return len(self._a)
  19. def copy(self):
  20. return set(self._a.keys())
  21. def __and__(self, other):
  22. return {elem for elem in self if elem in other}
  23. def __sub__(self, other):
  24. return {elem for elem in self if elem not in other}
  25. def __or__(self, other):
  26. ret = self.copy()
  27. ret.update(other)
  28. return ret
  29. def __xor__(self, other):
  30. _0 = self - other
  31. _1 = other - self
  32. return _0 | _1
  33. def union(self, other):
  34. return self | other
  35. def intersection(self, other):
  36. return self & other
  37. def difference(self, other):
  38. return self - other
  39. def symmetric_difference(self, other):
  40. return self ^ other
  41. def __eq__(self, other):
  42. if not isinstance(other, set):
  43. return NotImplemented
  44. return len(self ^ other) == 0
  45. def isdisjoint(self, other):
  46. return len(self & other) == 0
  47. def issubset(self, other):
  48. return len(self - other) == 0
  49. def issuperset(self, other):
  50. return len(other - self) == 0
  51. def __contains__(self, elem):
  52. return elem in self._a
  53. def __repr__(self):
  54. if len(self) == 0:
  55. return 'set()'
  56. return '{'+ ', '.join([repr(i) for i in self._a.keys()]) + '}'
  57. def __iter__(self):
  58. return iter(self._a.keys())