У меня проблема с дальностью математики минус.
Во-первых, у меня большой диапазон значений int, пусть он будет:
Range_A = range (5, 21)
, затем я такжеиметь несколько небольших диапазонов, пусть это будет:
Range_B = (диапазон (1,4) + диапазон (1,7) + диапазон (10,16) + диапазон (19,26))
наконец, проблема в том, что Range_A остается после удаления всех элементов Range_B:
Range_A - Range_B =
range (7,10) + range (16, 19)
пока все просто, но, поскольку длина диапазонов может быть очень большой, когда я пытался с алгоритмом проверки каждого элемента в Range_A и Range_B (я использую структуру данных set () вPython, хотелось бы, чтобы это было быстрее), время работы все еще становится неприемлемым:
>>> A = set (range (5,21))
>>> B= set.union (набор (диапазон (1,4)), набор (диапазон (1,7)), набор (диапазон (10,16)), набор (диапазон (19,26)))
>>> A - B
установлено ([7,8,9,16,17,18])
def hug(a):
"""return start and end of continuous element from a list
[1,2,3,5,7,8,9,12] -> [[1,3],[7,9]]
return [-1,-1] if input is a empty list
"""
if not a:
return [[-1,-1]]
a = sorted(list(set(a)))
res = []
head = a[0]; last = a[0]
for now in a[1:]:
if now == last + 1:
# proced
last = now
if now == a[-1]:
res.append([head, last])
else:
#print now
if head != last:
res.append([head, last])
head = now
last = now
return res
# последний шаг
>>> обнять ([7,8,9,16,17,18])
[[7,9], [16,18]]
Я думал, что должны быть некоторые четкие способы достичь этого, просто проверяя начальную и конечную точку каждого диапазона, а не каждого элемента int в нем.
Спасибо!Любая идея будет оценена.