2012-04-02 60 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分鐘。將列表轉換爲集合並使用交集的總和。