我想检查一个列表的范围是否在下一个列表的范围内,这是一个例子:
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列表)。
答案 0 :(得分:5)
您知道范围[a,b]
的范围[c,d]
范围为c <= a
和b <= 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:])]