如果你有两对值,开始和结束——你如何计算它们的重叠在哪里?
即,如果开始和结束值对是
[10, 20], [15, 20]
在这种情况下compute_overlap((15,20),(10,20))
应该返回(15,20)
,因为那是重叠的地方。
做这个的最好方式是什么?
如果你的区间是a, b
and 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 - x
或y - x + 1
,具体取决于您的间隔是封闭的还是半封闭的(假设这里是整数)。
用于zip
将起点和终点组合在一起。然后用max
求最大起点,min
求最小终点:
>>> def compute_overlap(pairs):
... starts, ends = zip(*pairs)
... return max(starts), min(ends)
...
>>> compute_overlap(([10, 20], [15,20]))
(15, 20)
假设您有一个可迭代的并且您想要计算相邻项目的重叠......
您需要“成对”产生元素。通常,这很简单:
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):
...