我有这个数组:[[0,10,20],[1,15,25],[2,20,40]]
0, 1, 2
将成为ID,10,20
15,25
20,40
将是他们各自的范围。
所以,我需要弄清楚范围和哪个ID有哪个范围。
每个id代表一个手电筒,每个都有自己的范围,我需要这个来确定哪些区域被哪些手电筒照亮。
我不知道是否足够清楚,所以这是我期望从代码返回的内容:
[
[0],[10,15],
[0,1],[15,20],
[1,2],[20,25],
[2], [25,40]
]
提前致谢。
答案 0 :(得分: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
答案 1 :(得分: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]}