我在其他编程语言(ruby、C++、JS 等)中发现了许多类似的问题,但在 Python 中却没有。因为Python有例如itertools我想知道我们是否可以在Python中更优雅地做同样的事情。
假设我们有一个“完整范围”,[1,100]然后是“完整范围”内/匹配“完整范围”的范围子集:
[10,50][90,100][1,9]在本例中,我们如何提取未覆盖的位置[51,89]?
这是一个玩具示例,在我的真实数据集中,范围高达数千。
这是一个使用以下方法的巧妙解决方案itertools.chain:我假设输入范围不重叠。如果确实如此,则需要首先使用范围并集算法对其进行简化。
from itertools import chain
def range_gaps(a, b, ranges):
ranges = sorted(ranges)
flat = chain((a-1,), chain.from_iterable(ranges), (b+1,))
return [[x+1, y-1] for x, y in zip(flat, flat) if x+1 < y]
Run Code Online (Sandbox Code Playgroud)
举range_gaps(1, 100, [[10, 50], [90, 100]])个例子:
flat是一个迭代器,它将给出序列0, 10, 50, 90, 100, 101。flat是惰性评估的,并通过迭代消耗它,zip(flat, flat)因此给出了像 之类的对序列(0, 10), (50, 90), (100, 101)。(1, 9), (51, 89)和 的情况一样(100, 101),应该给出一个空范围,因此它被丢弃。| 归档时间: |
|
| 查看次数: |
2458 次 |
| 最近记录: |