6.2.1. Sets

This class implements mathematical sets using a dictionary.
Start python section to interscript/core/sets.py[1 /1 ]
     1: #line 6 "sets.ipk"
     2: class set:
     3:   __class_protocols__= ['sequence','mutable','set']
     4:   def __init__(self,*args):
     5:     self.s = {}
     6:     for e in args: self.s[e]=None
     7: 
     8:   # set contains element
     9:   def contains(self,e):
    10:     return self.s.has_key(e)
    11: 
    12:   # we're an improper subset of the rhs
    13:   def le(self,rhs):
    14:     for e in self.s.keys():
    15:       if e not in rhs: return 0
    16:     return 1
    17: 
    18:   # the rhs is an improper subset of us
    19:   def ge(self,rhs):
    20:     for e in rhs:
    21:       if not self.s.has_key(e): return 0
    22:     return 1
    23: 
    24:   def eq(self,rhs):
    25:     return self.le(rhs) and self.ge(rhs)
    26: 
    27:   def ne(self,rhs):
    28:     for e in rhs:
    29:       if not self.s.has_key(e): return 1
    30:     for e in self.s.keys():
    31:       if not e in rhs: return 1
    32:     return 0
    33: 
    34:   def gt(self,rhs):
    35:     return self.ne(rhs) and self.ge(rhs)
    36: 
    37:   def lt(self,rhs):
    38:     return self.ne(rhs) and self.le(rhs)
    39: 
    40:   def min(self):
    41:     return min(self.s.keys())
    42: 
    43:   def max(self):
    44:     return max(self.s.keys())
    45: 
    46:   def index(self,e):
    47:     return self.s.keys().index(e)
    48: 
    49:   def count(self,e):
    50:     return self.s.has_key(e)
    51: 
    52:   # ensure set contains element; no error if already in set
    53:   def insert(self,e):
    54:     self.s[e]=None
    55: 
    56:   # remove element, must be in set or error
    57:   def remove(self,e):
    58:     del self.s[e]
    59: 
    60:   # remove element if in set
    61:   def excise(self,e):
    62:     if self.s.has_key(e): del self.s[e]
    63: 
    64:   # append all the elements in the sequence
    65:   def append_sequence(self,seq):
    66:     for e in seq: self.s[e]=None
    67: 
    68:   # get list of elements
    69:   def list(self):
    70:     return self.s.keys()
    71: 
    72:   # get tuple of elements
    73:   def tuple(self):
    74:     return tuple(self.s.keys())
    75: 
    76:   # get dictionary of elements
    77:   def dict(self):
    78:     return self.s.copy()
    79: 
    80:   # return a copy of this set
    81:   def copy(self):
    82:     s = set()
    83:     s.s = self.s.copy()
    84:     return s
    85: 
    86:   # repr is set(e1, e2, e3) etc
    87:   def __repr__(self):
    88:     keys = self.s.keys()
    89:     p = 'set('
    90:     if keys: p = p + repr(keys[0])
    91:     for key in keys[1:]: p = p + ', ' + repr(key)
    92:     p = p + ')'
    93:     return p
    94: 
    95:   # 0 if empty, 1 otherwise
    96:   def __nonzero__(self):
    97:     return len(s)!=0
    98: 
    99:   # lexicographical comparison!
   100:   # a < b does NOT mean a is a subset of b!!!
   101: 
   102:   def __cmp__(self,other):
   103:     right = set()
   104:     for e in other: right.insert(e)
   105:     k1 = self.s.keys()
   106:     k1.sort()
   107:     k2 = right.s.keys()
   108:     k2.sort()
   109:     return cmp(k1,k2)
   110: 
   111:   def __len__(self):
   112:     return len(self.s)
   113: 
   114:   def __getitem__(self,index):
   115:     return self.s.keys()[index]
   116: 
   117:   def __delitem__(self,index):
   118:     k = self.s.keys()[index]
   119:     del self.s[k]
   120: 
   121:   def __getslice__(self,i,j):
   122:     return apply(set,tuple(self.s.keys()[i:j]))
   123: 
   124:   def __and__(self,right):
   125:     s = set()
   126:     for e in self.s.keys():
   127:       if e in right: s.insert(e)
   128:     return s
   129: 
   130:   def __or__(self,right):
   131:     s = set()
   132:     s.s = self.s.copy()
   133:     for e in right: s.s[e]=None
   134:     return s
   135: 
   136:   def __xor__(self,right):
   137:     s = set()
   138:     for e in right: s.insert(e)
   139:     for e in self.s.keys():
   140:       if s.s.has_key(e): del s.s[e]
   141:       else: s.s[e]=None
   142:     return s
   143: 
   144:   def __add__(self,right):
   145:     return self.__or__(right)
   146: 
   147:   def __sub__(self,right):
   148:     s = set()
   149:     for e in self.s.keys():
   150:       if e not in right: s.insert(e)
   151:     return s
   152: 
End python section to interscript/core/sets.py[1]


6.2.1.1. Test source
6.2.1.2. Test output