我有两个包含两种不同类型“事件”的列表(listA和listB),每个事件都有其发生的时间段(存储为开始时间和持续时间(以秒为单位)),我想查找所有事件listA中发生的事件与listB中发生的任何事件同时发生。
如果时间上有任何重叠,则事件不必在完全相同的时间和相同的持续时间内发生。此外,列表列表内没有重叠,在任何给定的秒内,listA最多有一个事件运行,而listB最多有一个事件正在运行。最后,listB中的所有事件必须发生在listA中的事件内(它可以与listA中的事件同时开始和结束,但不能在它之前或之后开始)。换句话说,所有listB事件都完全包含在listA事件内,并且listA事件将包含0
至n
个listB事件。
现在,我想与列表A中的每个项目相比,我可以对列表B中的每个项目进行设置相交,但这似乎效率不高,是否有有效的方式来查找所有此类重叠项?
样品清单:
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": "..."
}
]
因此在此example 我会得到A1和A3(因为它们分别与B1和B2重叠),而A2将被忽略。
我也不在乎A1是否与多个B对象重叠,因此我实际上只需要与至少一个listB事件同时发生的所有listA事件的列表,或其索引的列表或任何其他内容
答案 0 :(得分:0)
这是一段代码,显示了我编写的一个相当通用的类(很久以前)。数量不多,但希望它至少可以为您开发自己的产品提供一个起点。
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