2

如果你有两对值,开始和结束——你如何计算它们的重叠在哪里?

即,如果开始和结束值对是

[10, 20], [15, 20]

在这种情况下compute_overlap((15,20),(10,20))应该返回(15,20),因为那是重叠的地方。

做这个的最好方式是什么?

4

3 回答 3

7

如果你的区间是a, band c, d,即

(a, b), (c, d) = [10, 20], [15, 20]

那么重叠区间是

x, y = max(a, c), min(b, d)
if x > y:  # no overlap
    x, y = None, None

并且重叠量是y - xy - x + 1,具体取决于您的间隔是封闭的还是半封闭的(假设这里是整数)。

于 2013-03-08T14:43:46.897 回答
3

用于zip将起点和终点组合在一起。然后用max求最大起点,min求最小终点:

>>> def compute_overlap(pairs):
...     starts, ends = zip(*pairs)
...     return max(starts), min(ends)
... 
>>> compute_overlap(([10, 20], [15,20]))
(15, 20)
于 2013-03-08T14:48:42.633 回答
1

假设您有一个可迭代的并且您想要计算相邻项目的重叠......

您需要“成对”产生元素。通常,这很简单:

seq = [[10, 20], [15, 20]]
for lower,upper in zip(seq,seq[1:]):
    if upper[0] > lower[1]:
        print lower[1],upper[0] 
    else:
        print None, None

不幸的是,切片仅适用于序列,而不适用于任意迭代。不过不难概括:

def funny_zip(seq):
    iseq = iter(seq)
    current = next(iseq):
    for item in iseq:
        yield current,item
        current = item

现在你可以使用:

for lower,upper in funny_zip(seq):
    ...
于 2013-03-08T14:43:33.550 回答