4

既存のライブラリを使用せずに、Pythonで3つの範囲のオーバーラップを決定する方法について質問がありました。

たとえば、(10,20)(15,25)(18,30)のように3つの範囲がある場合、それらの間の重複を見つけるにはどうすればよいですか?

私の答えは(18,19,20)でなければなりません

どんな助けでも大歓迎です。ありがとう !

4

2 に答える 2

8

オーバーラップは、最も高い開始点から最も低い終了点まで続きます。

ranges = [(10,20), (15,25), (18,30)]
starts, ends = zip(*ranges)
result = range(max(starts), min(ends) + 1)

テスト:

>>> print(*result)
18 19 20
于 2012-05-25T22:03:28.930 に答える
4

WolframHの回答intersectionがこの場合の最良の回答ですが、セットとその操作を使用するという繰り返し要素について心配する必要がない場合、重複を見つけるためのより一般的な解決策が利用可能です。

>>> set(range(10, 21)) & set(range(15, 26)) & set(range(18, 31))
{18, 19, 20}

または、より一般的な解決策として:

ranges = [(10, 20), (15, 25), (18, 30)]
set.intersection(*(set(range(start, finish+1)) for start, finish in ranges))
于 2012-05-25T22:13:07.837 に答える