我有一个元组列表,每个元组都是一个(start-time, end-time)
。我正在尝试合并所有重叠的时间范围,并返回不同时间范围的列表。例如
[(1, 5), (2, 4), (3, 6)] ---> [(1,6)]
[(1, 3), (2, 4), (5, 8)] ---> [(1, 4), (5,8)]
这是我的实现方法。
# Algorithm
# initialranges: [(a,b), (c,d), (e,f), ...]
# First we sort each tuple then whole list.
# This will ensure that a<b, c<d, e<f ... and a < c < e ...
# BUT the order of b, d, f ... is still random
# Now we have only 3 possibilities
#================================================
# b<c<d: a-------b Ans: [(a,b),(c,d)]
# c---d
# c<=b<d: a-------b Ans: [(a,d)]
# c---d
# c<d<b: a-------b Ans: [(a,b)]
# c---d
#================================================
def mergeoverlapping(initialranges):
i = sorted(set([tuple(sorted(x)) for x in initialranges]))
# initialize final ranges to [(a,b)]
f = [i[0]]
for c, d in i[1:]:
a, b = f[-1]
if c<=b<d:
f[-1] = a, d
elif b<c<d:
f.append((c,d))
else:
# else case included for clarity. Since
# we already sorted the tuples and the list
# only remaining possibility is c<d<b
# in which case we can silently pass
pass
return f
我想弄清楚是否
感谢您的帮助。谢谢!
使用Pythonic可以提高效率的几种方法:
set()
构造,因为该算法应在主循环中删除重复项。yield
生成值。tuple()
调用移至产生最终值的位置,从而省去了构造和丢弃多余的元组的麻烦,并重用了saved
用于存储当前时间范围的列表以进行比较。码:
def merge(times):
saved = list(times[0])
for st, en in sorted([sorted(t) for t in times]):
if st <= saved[1]:
saved[1] = max(saved[1], en)
else:
yield tuple(saved)
saved[0] = st
saved[1] = en
yield tuple(saved)
data = [
[(1, 5), (2, 4), (3, 6)],
[(1, 3), (2, 4), (5, 8)]
]
for times in data:
print list(merge(times))
问题内容: T-SQL DateTime问题。 我有一组时间范围。在这些时间范围内,可能会有一组重叠的时间范围,我称之为“封锁”时间。封锁的时间不会超过一天。我想要做的是分配时间以排除阻塞时间,基本上是给我没有“阻塞”的时间范围。可以肯定的是,阻塞时间不能超出时间范围。 示例:我工作时间是从上午9点到下午5点,在下午1点有30分钟的午餐时间。我想要2行的结果:9am至1pm和1.30pm至5pm。
问题内容: 我需要确保数据库仅包含两个或两个以上列是唯一的条目。这可以很容易地通过对那些列的约束来实现。 就我而言,我只需要在重叠的时间范围内禁止重复。该表具有和列。在某些情况下,可能首先需要通过设置来使活动条目到期,然后插入调整为和的新条目。 使用似乎可以使先前的条目到期而没有任何问题,但是由于我的基本列当前为,因此插入新条目似乎很麻烦,因此无法再次添加。 我考虑添加和作为约束的一部分,但这只会
问题内容: 我在PostgreSQL 9.2中有一张表,看起来像这样(简化): 对于每个feature_id,可能会有多行,其时间范围由begin_time / end_time指定。它们可能重叠,但这是相对罕见的。我正在寻找一种快速的方法来查找所有具有/不具有 任何 重叠的feature_id 。 我尝试使用窗口函数来执行此操作,如下所示: …但这是行不通的: 该算法很简单:按begin_tim
我们有一个Postgres表(物化视图),其中包含大约200万行,列如下: start_time(timestampz)-有索引 end_time(timestampz)-有索引 对于表中的每一行,我们希望添加一个包含以下内容的结果列: 1,如果行开始和结束时间范围与任何其他行重叠 0,如果行开始和结束时间范围不与任何其他行重叠 将每一行标记为具有重叠(1或0)的有效方法是什么? 编辑: 预期产出
问题内容: 假设您有一个包含标识符,开始时间和结束时间的表。这些开始和结束时间可以是任何时间长度。开始时间总是早于结束时间。假设没有空值。 哪种查询会告诉我最“受欢迎”的时间,即每行中的两个范围与其他大多数行重叠的地方? 现实生活中的应用是,它是一个记录用户登录和注销时间的表格。我想编写一个查询,该查询将告诉我何时有最多并发用户登录,并查看这段时间。 谢谢你。 问题答案: 这是使用简单自连接和a的
本文向大家介绍coldfusion 日期或时间范围,包括了coldfusion 日期或时间范围的使用技巧和注意事项,需要的朋友参考一下 示例 日期或时间范围的示例。