检查列表范围是否在另一个列表范围内

时间:2017-03-02 12:58:48

标签: python list

我想检查一个列表的范围是否在下一个列表的范围内,这是一个例子:

pos = [[50, 100], [50, 200], [250, 1500], [300, 2000], [300, 3300]]

正如我们在此处看到的,pos[0]的范围为pos[1][50, 100]中包含的[50, 200]),与pos[2]相同pos[3]pos[4] pos[5]。{/ p>

为此,我创建了一个返回布尔值的函数:

def in_list(i): # index of the list
    if i < len(pos)-2 and pos[i][0] >= pos[i+1][0] and pos[i][0] <= pos[i+1][1] 
    and pos[i][1] >= pos[i+1][0] and pos[i][1] <= pos[i+1][1]:
        return True
    else:
        return False

它看起来很丑陋,任何人都可以建议另一种解决方案吗?

修改:

正如@MKesper建议的那样,我还应该使用循环遍历列表条目(并且可能获得每个位置的True / False列表)。

2 个答案:

答案 0 :(得分:5)

您知道范围[a,b]的范围[c,d]范围为c <= ab <= d(因此a,b夹在c,d之间或c <= a < b <= d,但我们假设a < b始终保持不变。所以你可以简单地使用:

def in_list(pos,i):
    a,b = pos[i]
    c,d = pos[i+1]
    return c <= a and b <= d

如果您想检查任何这种情况,可以使用:

any(in_list(pos,i) for i in range(len(pos)-1))

答案 1 :(得分:3)

使用移位的副本对列表进行压缩/交错,然后检查以前的项目是否包含在范围内。

计算所有元素的一个班轮:

pos = [[50, 100], [50, 200], [250, 1500], [300, 2000], [300, 3300]]

result = [all(x1 <= a  <= y1 for a in t) for t,(x1,y1) in zip(pos,pos[1:])]


print(result)

结果:

[True, False, False, True]

(结果当然少了1项:最后一项无法获得资格/未经过测试)

也许all过度杀伤,因为只有2个要测试的值,所以替代方案可能是:

result = [x1 <= x0 <= y1 and x1 <= y0 <= y1  for (x0,y0),(x1,y1) in zip(pos,pos[1:])]