查找重叠,哪个给定列表(如[2,4]之类的间隔列表)返回两个间隔是否重叠。边界重叠不计算在内。 示例:
`>>> check_overlap(li=[[1,5], [8,9], [3,6]])
True
>>> check_overlap(li=[[1,5], [5,6]])
False`
data= [[1, 5], [8, 9], [3, 6]]
values = [[value for value in range(elem[0], elem[1])]for elem in data]
print(values)
[[1, 2, 3, 4], [8], [3, 4, 5]]
之后,我想知道如何检查列表中的每个元素是否有两个间隔重叠。
答案 0 :(得分:0)
为了检查重叠,我将较大的列表与子列表的第一个元素进行排序,并检查子列表的第二个元素大于下一个子列表的第一个元素。
def overlap(li):
li.sort(key=lambda x: x[0])
for i in range(len(li)-1):
if li[i][1] > li[i+1][0]:
return True
return False
print(overlap([[1,5], [8,9], [3,6]]))
print(overlap([[1,5], [5,6]]))
True
False
答案 1 :(得分:0)
如果只有整数,则可以使用range进行此测试:
def check_overlap(li):
ranges = [range(r[0]+1, r[1]-1) for r in li]
return any(any(e-1 in r for r in ranges) for l in li for e in l)
另一方面,如果您有浮点值,则必须分别测试间隔的两个边界(使用<
和>
):
def is_in_range(value, boundaries):
m, M = boundaries
return value > m+1 and value < M-1
def check_overlap(li):
return any(any(is_in_range(e, r) for r in li) for l in li for e in l)
答案 2 :(得分:0)
我会这样使用itertools.combinations
函数:
from itertools import combinations
def check_overlap(li):
lists = [list(range(a, b)) for a, b in li] # Shorter way of your values = ... line
for l1, l2 in combinations(lists, 2):
if any(l in l2 for l in l1):
return True
return False
combinations(lists, 2)
调用为您提供了不同元素的所有可能唯一组合。
接下来,any()
函数采用任何可迭代的,如果可迭代中的任何元素为True
(或更确切地说是“真实的”),则返回True
。在这种情况下,l in l2 for l in l1
是一个生成器表达式,但是使用方括号括起来可以将其明确地首先放入一个列表中。
答案 3 :(得分:0)
您可以创建集合并检查交集-
data= [[1, 5], [8, 9], [3, 6]]
sets_from_data = [set(range(*l)) for l in data]
intersection_exists = bool(max([len(a.intersection(b)) for a in sets_from_data for b in sets_from_data if a != b]) > 0)
intersection_exists
# True