查找给定列表的重叠

时间:2019-04-16 12:10:22

标签: python-3.x

查找重叠,哪个给定列表(如[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]]

之后,我想知道如何检查列表中的每个元素是否有两个间隔重叠。

4 个答案:

答案 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