値のペアが2つある場合、開始と終了-それらのオーバーラップがどこにあるかをどのように計算しますか?
つまり、開始値と終了値のペアが
[10、20]、[15、20]
この場合、オーバーラップがあるのでcompute_overlap((15,20),(10,20))
戻る必要(15,20)
があります。
これを行うための最良の方法は何ですか?
あなたの間隔がa, b
とである場合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):
...