不要那样做。而是:
-
将每个范围按从低到高的顺序排列。
-
如果范围为1。最低(>);range2.最低,然后将range1与range2交换
-
如果范围为1。最高(>);范围2.最小然后范围相交
-
如果范围为1。最高==范围2。最低然后范围触摸
-
如果范围为1。最高(<);范围2.最低,则范围不同。
上述算法与范围大小无关,也可以处理非整数范围。
类似于:
def is_overlapped(r1, r2):
if r1.lowest > r2.lowest:
r1, r2 = r2, r1
return r1.highest > r2.lowest
更全面的实施:
from collections import namedtuple
class Range(namedtuple('Range', 'lowest, highest')):
__slots__ = ()
def __new__(_cls, lowest, highest):
'Enforces lowest <= highest'
if lowest > highest:
lowest, highest = highest, lowest
return super().__new__(_cls, lowest, highest)
def is_overlapped(r1, r2):
r1, r2 = sorted([r1, r2])
return r1.highest > r2.lowest
if __name__ == '__main__':
range1, range2 = Range(4, -4), Range(7, 3)
assert is_overlapped(range2, range1) == is_overlapped(range1, range2)
print(is_overlapped(range2, range1))