我有一个关于使用Python确定三个范围的重叠而不使用任何现有库的问题:
例如,如果我有三个范围(10,20)(15,25)(18,30),我应该如何找到它们之间的重叠部分?
我的答案应该是(18,19,20)。
任何帮助都将不胜感激。谢谢!
例如,如果我有三个范围(10,20)(15,25)(18,30),我应该如何找到它们之间的重叠部分?
我的答案应该是(18,19,20)。
任何帮助都将不胜感激。谢谢!
重叠部分从最高的起点到最低的终点:
```ranges = [(10,20), (15,25), (18,30)]
starts, ends = zip(*ranges)
result = range(max(starts), min(ends) + 1)
测试:
>>> print(*result)
18 19 20
xrange
),并且结果非常大,否则这将很快。如果您必须创建实际的列表并且它们非常大,则没有任何方法可以帮助。 - Reinstate Monica虽然WolframH的答案是这种情况下最好的答案,但如果您不需要担心重复元素,则可以使用集合及其intersection
操作来获得更一般的查找重叠解决方案。
>>> set(range(10, 21)) & set(range(15, 26)) & set(range(18, 31))
{18, 19, 20}
ranges = [(10, 20), (15, 25), (18, 30)]
set.intersection(*(set(range(start, finish+1)) for start, finish in ranges))
reduce
:set.intersection(*(set(range(start, finish+1)) for start, finish in ranges))
。 - Reinstate Monicaset.intersection()
可以接受多个集合,太棒了。每当我不得不使用reduce()
时,我总是感到很不舒服。已编辑。 - Gareth Latty
range(10, 20)
) 的取值范围是第二个值之前的数,不包括第二个值,所以预期输出为(18, 19)
。 - Gareth Latty