1

私はこの配列を持っています:[[0,10,20],[1,15,25],[2,20,40]]

0, 1, 2IDであり10,20 15,25 20,40、それぞれの範囲になります。

したがって、範囲と、どの ID がどの範囲を持っているかを把握する必要があります。

各 ID は懐中電灯を表し、それぞれに独自の範囲があります。これは、どの領域がどの懐中電灯によって照らされているかを把握するために必要です。

十分に明確かどうかはわかりませんが、コードから返されると予想されるものは次のとおりです。

[
 [0],[10,15],
 [0,1],[15,20],
 [1,2],[20,25],
 [2], [25,40]
]

前もって感謝します。

4

2 に答える 2

2

まず、実線を分割する必要があります。

min_boundaries = set(min for id, min, max in orig)
max_boundaries = set(max for id, min, max in orig)
segment_boundaries = sorted(list(min_boundaries | max_boundaries))

次に、セグメントごとに、そのセグメントを照らすライトを確認します。セグメントの中間点で十分です。

result = []
old_boundary = segment_boundaries[0]
for boundary in segment_boundaries[1:]:
    bounds = [old_boundary, boundary]
    middle = (old_boundary + boundary) / 2
    ids = [id for id, min, max in orig if min < middle < max]
    result.append(ids)
    result.append(bounds)
    old_boundary = boundary
于 2013-04-12T05:34:36.540 に答える
0

データ構造にいくつかの変更を加えた簡単な解決策は次のとおりです。

adict = {0: [10, 20], 1: [15, 25], 2: [20, 40]}
data = [(10, 15), (15, 20), (20, 25), (25, 40)]

# This will check the membership 
# in_([3,4], [2,3]) returns True
def in_(val1 , val2):
    return val2[0] >= val1[0] and val2[1] <= val1[1]


res = {}
for each in keys:
    for key in adict.keys():
        if in_(adict[key], each):
            res.setdefault(each, []).append(key)

O/P

>>>res
{(10, 15): [0], (15, 20): [0, 1], (25, 40): [2], (20, 25): [1, 2]}
于 2013-04-12T06:43:55.783 に答える