如何通过delta来合并时间/时间间隔

2024-04-25 19:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但这是一个非常丑陋的世界


Tags: keyinfor间隔lenreturnifvalue
1条回答
网友
1楼 · 发布于 2024-04-25 19:27:25

这个怎么样

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}]

相关问题 更多 >