def decouples(self, rhs): """ Decouple this item with the other """ assert isinstance(rhs, RangeItem) # print self.items, rhs.items new_values = [self.items - rhs.items, rhs.items - self.items, self.items & rhs.items] new_items = [] for value in new_values: # print value # print '%s - %s' % str(value.lower_bound()), str(value.upper_bound) if len(value) != 0: new_items.append(RangeItem(value.lower_bound(), value.upper_bound())) else: empty_range = RangeItem(0, 0) empty_range.items = IntervalSet.empty() new_items.append(empty_range) return new_items
class RangeItem: items = IntervalSet.empty() def __init__(self, low, high): """ Initialize a range item with lower bound and higher bound. """ self.items = IntervalSet([Interval(low, high)]) def __eq__(self, rhs): """ Redefine == operator """ assert isinstance(rhs, RangeItem) return self.items == rhs.items def empty(self): if len(self.items) == 0: return True return False def dump(self, type='ip'): if self.empty(): print 'Empty RangeItem' else: if type == 'int': print 'RangeItem %s - %s' % (self.items.lower_bound(), self.items.upper_bound()) elif type == 'ip': print 'RangeItem %s - %s' % (long2ip(self.items.lower_bound()), long2ip(self.items.upper_bound())) def produce(self): return RangeItem(self.items.lower_bound(), self.items.upper_bound()) def overlaps(self, rhs): """ If this item is overlapped with the other """ if len(self.items & rhs.items) != 0: return True return False def includes(self, rhs): """ If this item includes the other """ if self.items & rhs.items == rhs.items: return True return False def decouples(self, rhs): """ Decouple this item with the other """ assert isinstance(rhs, RangeItem) # print self.items, rhs.items new_values = [ self.items - rhs.items, rhs.items - self.items, self.items & rhs.items ] new_items = [] for value in new_values: # print value # print '%s - %s' % str(value.lower_bound()), str(value.upper_bound) if len(value) != 0: new_items.append( RangeItem(value.lower_bound(), value.upper_bound())) else: empty_range = RangeItem(0, 0) empty_range.items = IntervalSet.empty() new_items.append(empty_range) return new_items
overtime = myHours - OfficeHours r1 = IntervalSet([Interval(1, 1000), Interval(1100, 1200)]) r2 = IntervalSet([Interval(30, 50), Interval(60, 200), Interval(1150, 1300)]) r3 = IntervalSet([Interval(1000, 3000)]) r4 = IntervalSet([Interval(1000, 3000)]) r5 = IntervalSet([Interval(30000, 12000)]) print (r3 - r4), (r4 - r3), r3 & r4 print len(IntervalSet.empty()) if r3 & r4 == r4: print 'yes' print r3 & r4 if (r3 - r4).empty(): print "true" print (r3 - r4).empty() ''' interval对象初始化参数(lower_bound=-Inf, upper_bound=Inf, **kwargs) 三个boolean参数closed,lower_closed,upper_closed分表表示全闭,左闭右开,左开右闭。 比如:r = Interval(upper_bound=62, closed=False) between(a, b, closed=True):返回以a和b为界的区间