2016-09-09 5 views
0

Ich habe eine Liste, die aus verschachtelten Listen besteht, jede verschachtelte Liste enthält zwei Werte - einen Gleitkommawert (Dateierstellungsdatum) und eine Zeichenfolge (a Name der Datei).Python: Berechnen der Differenz von Werten in einer verschachtelten Liste mit einer While - Schleife

Zum Beispiel:

n_List = [[201609070736L, 'GOPR5478.MP4'], [201609070753L, 'GP015478.MP4'],[201609070811L, 'GP025478.MP4']] 

Die verschachtelte Liste wird in der Reihenfolge der ansteigenden Werte (Erstellungsdatum) bereits sortiert. Ich versuche, eine While-Schleife zu verwenden, um den Unterschied zwischen den einzelnen Gleitkommawerten zu berechnen.

Beispiel: 201.609.070.753 - 201609070736 = 17

Das Ziel ist es, die Zeitdifferenzwerte als Basis zu verwenden, um die Dateien zu gruppieren.

Das Problem, das ich habe, ist, dass, wenn die Zählung den letzten Wert für len(n_List) erreicht, es eine IndexError wirft, weil count+1 außerhalb des Bereichs ist.

IndexError: list index out of range 

Ich kann nicht herausfinden, wie man diesen Fehler umgehen kann. Egal, was ich versuche, die Zählung ist immer von Bereich, wenn es den letzten Wert in der Liste erreicht.

Hier ist die While-Schleife, die ich verwendet habe.

count = 0 

while count <= len(n_List): 
    full_path = source_folder + "/" + n_List[count][1] 

    time_dif = n_List[count+1][0] - n_List[count][0] 


    if time_dif < 100: 
     f_List.write(full_path + "\n") 
     count = count + 1 
    else: 
     f_List.write(full_path + "\n") 
     f_List.close() 
     f_List = open(source_folder + 'GoPro' + '_' + str(count) + '.txt', 'w') 
     f_List.write(full_path + "\n") 
     count = count + 1 

PS. Die einzige Arbeit, die ich mir vorstellen kann, ist anzunehmen, dass der letzte Wert immer an die letzte Gruppe von Dateien angehängt wird. Wenn die Anzahl len(n_List - 1) erreicht, überspringe ich die Berechnung der Zeitdifferenz und füge den letzten Wert automatisch zur letzten Gruppe hinzu. Während dies wahrscheinlich die meiste Zeit funktioniert, kann ich Randfälle sehen, bei denen der endgültige Wert in der Liste in eine separate Gruppe gehen muss.

+0

In welchen Ordner soll die letzte Datei dann gehen? – Karin

+0

Die Dateien gehen eigentlich nirgendwohin, ich benutze nur die Zeit diff Berechnung, um die Dateien in verschiedene Listen zu gruppieren. Die Dateipfade werden basierend auf den Gruppierungen in separate txt-Dateien geschrieben. In diesem Fall würde der letzte Wert zur letzten Zeile der letzten Textdatei hinzugefügt. Ist das sinnvoll? – vgndc

+0

Was ist mit den letzten Daten? – galaxyan

Antwort

0

Ich denke, zip verwendet, könnte einfacher sein, einen Unterschied zu machen.

res1,res2 = [],[] 
for i,j in zip(n_List,n_List[1:]): 
    target = res1 if j[0]-i[0] < 100 else res2 
    target.append(i[1]) 
+0

@galaxyman, danke für die Hilfe, ich stimme zu, dass eine Zip-Funktion ist wahrscheinlich ein besserer Weg, um die Zeit diff. Aber ich habe immer noch zwei Probleme. (1) Wenn 'j [0] -i [0]' 100 oder größer ist, schreibt diese Funktion den 'i [0]' - Wert in eine neue Gruppe, wenn es wirklich der 'j [0]' - Wert ist, der dies tun sollte sei der Anfang der neuen Gruppe. (2) Ich sehe immer noch ein Problem, wenn die Funktion an das Ende der Liste gelangt. der letzte Wert in der Liste ist links von der letzten Gruppe, ich nehme an, weil die 'j [0] -i [0]' Operation nicht funktioniert, wenn du das letzte Mal erreichst - es gibt kein 'j [0]' danach es erreicht die endgültige 'i [0]' – vgndc

+0

@vgndc für die erste, können Sie die Liste nach der Schleife beenden. die zweite, was willst du zum letzten Element? – galaxyan

+0

@galaxyman, das Problem mit 'reversed()' ist, dass die Liste Werte in TXT-Datei geschrieben werden müssen. Beispiel: time dif <100 Schreibwert in text-1.txt, zum ersten Mal dif> 100 starte einen neuen text-2.txt. In umgekehrter Richtung wird also nicht wirklich behoben, was beim ersten Durchgang schief gelaufen ist. Werte wurden bereits in die falsche .txt-Datei geschrieben. Für die zweite Frage, versuchen Sie, klarer zu sein, scheint die Zip-Funktion ungleiche Paare in der verschachtelten Liste nicht zu berücksichtigen. also muss ich einen Weg finden, wenn die Schleife das letzte i, j Paar erreicht, um den letzten 'j [1]' Wert in die letzte .txt Datei zu schreiben. – vgndc

0

n_list (len (n_list)) immer einen Index außerhalb des zulässigen Bereichs Fehler zurück

while count < len(n_List): 

sollte genug sein, weil Sie Zählung bei 0 beginnen, werden, nicht 1.

0

FYI, hier ist die Lösung, die ich verwendet habe, dank @galaxyman für die Hilfe.

Ich behandelte das Problem des letzten Werts in der verschachtelten Liste, indem einfach diesen Wert nach Abschluss der Schleife hinzugefügt. Ich weiß nicht, ob das die eleganteste Art ist, es zu tun, aber es funktioniert.

(Hinweis: Ich poste nur die Funktion in Bezug auf die Zip-Methode in den vorherigen Posts vorgeschlagen).

def list_zip(get_gp_list): 
     ffmpeg_list = open(output_path + '\\' + gp_List[0][1][0:8] + '.txt', 'a') 
     for a,b in zip(gp_List,gp_List[1:]): 
      full_path = gopro_folder + '\\' + a[1] 
      time_dif = b[0]-a[0] 
      if time_dif < 100: 
       ffmpeg_list.write("file " + full_path + "\n") 
      else: 
       ffmpeg_list.write("file " + full_path + "\n") 
       ffmpeg_list.close() 
       ffmpeg_list = open(output_path + '\\' + b[1][0:8] + '.txt', 'a') 

    last_val = gp_List[-1][1] 
    ffmpeg_list.write("file " + gopro_folder + '\\' + last_val + "\n") 
    ffmpeg_list.close() 
Verwandte Themen