2

値のペアが2つある場合、開始と終了-それらのオーバーラップがどこにあるかをどのように計算しますか?

つまり、開始値と終了値のペアが

[10、20]、[15、20]

この場合、オーバーラップがあるのでcompute_overlap((15,20),(10,20))戻る必要(15,20)があります。

これを行うための最良の方法は何ですか?

4

3 に答える 3

7

あなたの間隔が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

于 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 に答える