如何按增量连接时间/整数间隔



我有一个简单的间隔列表:

[ 
  { "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}]

最新更新