在python

时间:2019-11-02 02:23:03

标签: python

我有两个包含两种不同类型“事件”的列表(listA和listB),每个事件都有其发生的时间段(存储为开始时间和持续时间(以秒为单位)),我想查找所有事件listA中发生的事件与listB中发生的任何事件同时发生。

如果时间上有任何重叠,则事件不必在完全相同的时间和相同的持续时间内发生。此外,列表列表内没有重叠,在任何给定的秒内,listA最多有一个事件运行,而listB最多有一个事件正在运行。最后,listB中的所有事件必须发生在listA中的事件内(它可以与listA中的事件同时开始和结束,但不能在它之前或之后开始)。换句话说,所有listB事件都完全包含在listA事件内,并且listA事件将包含0n个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事件的列表,或其索引的列表或任何其他内容

1 个答案:

答案 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