如何在Python中查找区间重叠?
在Python中,最好的方法是什么来判断两个范围内哪些值是重叠的?
举个例子:
x = range(1,10)
y = range(8,20)
(The answer I am looking for would be the integers 8 and 9.)
给定一个范围x,最好的方法是什么来遍历另一个范围y,并输出两个范围中所有共享的值?
补充:
后来我意识到,我还需要知道x是否与y重叠。我想找一种方法来遍历一个范围列表,并对重叠的范围做一些额外的操作。有没有简单的真/假语句可以做到这一点?
11 个回答
19
上面的回答看起来都太复杂了。这个一行代码在Python3中运行得很好,它可以接受范围作为输入并输出结果。它还可以处理不合法的范围。如果结果不是None,你只需要遍历一下结果就能得到值。
# return overlap range for two range objects or None if no ovelap
# does not handle step!=1
def range_intersect(r1, r2):
return range(max(r1.start,r2.start), min(r1.stop,r2.stop)) or None
149
如果步长总是+1(这是范围的默认设置),那么下面的方法应该比把每个列表转换成集合或者遍历任意一个列表更有效率:
range(max(x[0], y[0]), min(x[-1], y[-1])+1)
83
可以试试用集合的交集来解决这个问题:
x = range(1,10)
y = range(8,20)
xs = set(x)
xs.intersection(y)
输出结果:
set([8, 9])
需要注意的是,intersection
这个方法可以接受任何可迭代的对象作为参数(也就是说,y
不需要转换成一个集合才能进行这个操作)。还有一个和intersection
方法功能相同的操作符:&
,不过在这种情况下,它要求两个参数都必须是集合。