2012-04-02 6 views
2

Ich habe lange nachgedacht, konnte das aber nicht durcharbeiten. Betrachten Sie die folgenden Sequenzen über die Zeit, die den Status von Schaltern aufzeichnen:berechnen Zeit Schnittpunkt, wenn alle Sequenzen bestimmte Kriterien erfüllen?

A = [(10:00, 1), (11:00, 0), (12:00, 1), (12:30, 0), ..., (23:00, 1)] # schalten A ist um 10:00, ausschalten um 11:00 und so weiter

B = [(10:30, 1), (11 : 15, 0), (11:30, 1), (00.15, 0), ..., (23.30, 0)] # ebenfalls

C = ...

(In Wirklichkeit ist die Zeit im Format von python time.struct_time.)

Also im Grunde würde die Struktur be [(Zeit1, Status1), (Zeit2, Status2) ...]. Die Listen enthalten Daten innerhalb von 24 Stunden, und nur die Wechselinstanzen werden aufgezeichnet (so dass die benachbarten "Status" immer einander entgegengesetzt sind). Ich möchte die Gesamtzeit berechnen, wenn alle Schalter A, B, C eingeschaltet sind. Diese scheinbar einfache Frage braucht mich viele Tage, um etwas Nützliches zu finden. Bitte teile etwas von deiner Weisheit!

Antwort

4

Zuerst alle Listen in eine Liste von Tupeln im Format (time, switch, state) zusammenführen. Dann sortieren Sie alle Statusschalter nach Zeit und geben Sie eine Zeitleiste der Ereignisse an.

Dann haben Sie drei Variablen, a_on, b_on und c_on. Initialisieren Sie sie, wie das Problem angibt (beginnen sie alle aus oder an usw.). Dann tun Sie etwas wie folgt aus:

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

aber buchstäblich schreiben die Bedingung "a_on und b_on und c_on" funktioniert nicht, wie es nicht unbedingt erfüllen, auch wenn a, b, c alle eingeschaltet sind, weil die Zeiten diskret gespeichert sind. – agriprop

+0

ok ich sehe deinen Punkt hier. Ich hätte darüber nachdenken sollen! Danke – agriprop

+0

Sie könnten dies vereinfachen, indem Sie eine Funktion implementieren, die zwei Zeitleisten für die Eingabe als Eingabe verwendet und eine Zeitleiste zurückgibt. Auf diese Weise können Sie diese Funktion auf beliebig viele Switches erweitern. – GeneralBecos

0

Wie wäre es, die die Zeiten ein Schalter als eine Liste von Minuten des Tages wird aktiviert, wenn ein Schalter aktiviert ist, z.B. A=[600, 601, 602, ..., 659, ..., ], wobei 10am Minute 600 am Tag entspricht. Konvertieren Sie die Listen in Mengen und verwenden Sie eine Summe der Schnittmengen.

Verwandte Themen