2012-04-02 63 views
2

我一直在努力思考很久,但无法解决这个问题。考虑以下随时间推移的序列,其记录开关的状态:当所有的序列满足一定的标准时计算时间交集?

A = [(10:00,1),(11:00,0),(12:00,1),(12:30, 0),...,(23:00,1)]#开关A在10:00开启,在11:00关闭等等

B = [(10:30,1),(11 :15,0),(11:30,1),(12:15,0),...,(23:30,0)]#同样

C = ...

(实际上时间的格式是python的time.struct_time。)

所以基本上这个结构会be [(time1,status1),(time2,status2)...]。列表包含24小时内的数据,并且只记录切换实例(因此相邻的“状态”总是彼此相反)。我想计算所有开关A,B,C都打开时的总时间。这个看似简单的问题让我花了很多时间想出一些有用的东西。请分享你的一些智慧!

回答

4

首先将所有列表合并到(time, switch, state)格式的元组列表中。然后按时间对所有状态开关进行排序,给出事件的时间表。

然后有三个变量,a_on,b_onc_on。根据问题的具体情况对它们进行初始化(它们是否全部开启或关闭等)。然后做这样的事情:

last_time = 0 # starting time of data, 0 is here as example 
total_time = 0 # 0 seconds 

for time, switch, state in state_switches: 
    if a_on and b_on and c_on: 
     total_time += time - last_time 

    if switch == "A": 
     a_on = state 
    if switch == "B": 
     b_on = state 
    if switch == "C": 
     c_on = state 

    last_time = time 
+0

但字面上写入条件“a_on和b_on和c_on”不起作用,因为即使a,b,c全部打开,也不一定满足,因为存储的时间是离散的。 – agriprop 2012-04-02 12:37:21

+0

好的,我在这里看到你的观点。我应该想到这个!谢谢 – agriprop 2012-04-02 12:39:56

+0

您可以通过实现一个函数来简化这个过程,该函数将输入两个切换时间轴并返回一个时间轴。这样你可以扩展这个功能来处理任何数量的开关。 – GeneralBecos 2012-04-02 16:23:26

0

如何在启用开关表示开关之日起分钟的名单启用时间,例如A=[600, 601, 602, ..., 659, ..., ],其中10am对应于当天的600分钟。将列表转换为集合并使用交集的总和。