我有一个简单的间隔列表:
[
{ "begin" : 10, "end" : 20 },
{ "begin" : 1, "end" : 2 },
{ "begin" : 5, "end" : 7 },
{ "begin" : 100, "end" : 200 }
]
如何按条件连接间隔
if abs(current["end"] - next["begin"] < 40) ?
结果必须是:
[
{ "begin" : 1, "end" : 20 },
{ "begin" : 100, "end" : 200 }
]
我的解决方案:
from pyinter import interval, IntervalSet
def test():
g = sorted(g, key=itemgetter("begin"))
ln = len(g)
if ln < 2: return
i = 0
while i < ln - 1:
if abs(g[i]["end"] - g[i+1]["begin"]) < 40:
g[i]["end"] = g[i+1]["begin"]
i = i + 1
a = IntervalSet()
for i in range(len(g)):
a.add(interval.closed( g[i]["begin"], g[i]["end"] ))
res = []
for key in a:
res.append({ "begin" : key.lower_value, "end" : key.upper_value })
return res
但这是一个非常丑陋的
这个怎么样,
list_dicts = [ {"begin" : 10, "end" : 20 },
{"begin" : 1, "end" : 2 },
{"begin" : 5, "end" : 7 },
{"begin" : 100, "end" : 200 }]
# sorted by d['begin']
ld = sorted(list_dicts, key=lambda d:d['begin'])
# merge
results = [ld[0]]
for idx, d in enumerate(ld[1:], 1):
if abs(d['begin'] - results[-1]['end']) < 40:
results[-1]['end'] = d['end']
else:
results.append(d)
print(results)
# Output
[{'begin': 1, 'end': 20}, {'begin': 100, 'end': 200}]