python - 在python中查找重叠的时间段
问题描述
我有两个不同类型的“事件”(listA 和 listB)的列表,每个事件都有一个发生的时间段(存储为开始时间和持续时间,以秒为单位),我想从 listA 中查找所有事件这与 listB 中发生的任何事件同时发生。
这些事件不需要在完全相同的时间和相同的持续时间内发生,如果有任何时间重叠将被计算在内。此外,列表列表中没有重叠,在任何给定的秒内,最多有一个来自 listA 的事件和一个来自 listB 的事件正在运行。最后,listB 中的所有事件都必须发生在来自 listA 的事件中(它可以与 listA 中的事件同时开始和结束,但不能在它之前开始或在它之后结束)。换句话说,所有 listB 事件都完全包含在 listA 事件中,而 listA 事件必须0
包含n
在其中的 listB 事件。
现在,我想我可以为 listB 中的每个项目与 listA 中的每个项目做一个集合交集,但这似乎真的效率低下,有没有找到所有这些重叠的有效方法?
样品清单:
listA=[
{
"duration": 3600,
"starttime": "1/31/2019 5:00",
"listAData": "..."
},
{
"duration": 1800,
"starttime": "1/31/2019 7:00"
"listAData": "..."
},
{...},
]
listB=[
{
"duration": 1800,
"starttime": "1/31/2019 5:15",
"listBData": "..."
},
{
"duration": 60,
"starttime": "2/1/2019 23:00"
"listBData": "..."
}
]
所以在这个例子中 ,我会得到 A1 和 A3(因为它们分别与 B1 和 B2 重叠),而 A2 将被忽略。
我也不关心 A1 是否与多个 B 对象重叠,所以我真的只需要与至少一个 listB 事件同时发生的所有 listA 事件的列表,或者它们的索引列表等。
解决方案
这是一段代码,显示了我(很久以前)编写的一个相当通用的类。这并不多,但希望它至少可以为您提供一个开发自己的起点。
class Interval(object):
# Representation of a closed interval.
# a & b can be numeric, dates, or any other object type than can be
# compared. if the type can also be incremented by 1, then it will be
# possible to iterate between the two values in ascending order.
def __init__(self, a, b):
#self.lowerbound, self.upperbound = min(a, b), max(a, b)
#self.lowerbound, self.upperbound = sorted([a, b]) # Py v2.4
self.lowerbound, self.upperbound = (a, b) if a < b else (b, a) # Py v2.5
def __contains__(self, val):
return self.lowerbound <= val <= self.upperbound
# Implemented as a generator (so no 'next' method needed)
def __iter__(self):
nextvalue = self.lowerbound # initialize iteration state
while nextvalue <= self.upperbound:
yield nextvalue
nextvalue += 1
推荐阅读
- google-apps-script - 我无法从任何文件夹访问 createFile 方法。我想从 URL 将图像文件保存在 gdrive 中
- reactjs - 如何故意将 Web 服务器配置为返回 500
- node.js - renderer() 组件中的状态未更新
- javascript - 渲染 Firebase JSON 对象反应
- javascript - 浏览器:已经声明了标识符输入,但仅在 wordpress 上?
- java - 在没有库的情况下转换为 JSONObject 并返回 Kotlin
- google-apps-script - 使用应用程序脚本在 Big Query 中创建视图 | 错误:对 bigquery.tables.insert 的 API 调用失败并出现错误:缺少必需的参数(第 21 行
- c++ - 如何使用 strcmp 使循环结束循环
- angular - 如何将 metronic 的引导主题用于其他有角度的现有项目?
- java - 如何在java中使用预定义变量设置计数器