2016-06-15 15 views
0

Sorry; Ich weiß, dass es tausend "make unique list" -Threads gibt. Ich habe versucht, das alleine zu lösen oder eine andere Lösung zu "machen", aber ich war mit meinen nicht erstaunlichen Python-Fähigkeiten nicht erfolgreich.Python: Eindeutige Liste (basierend auf einem Teil des Dateipfads)

Ich habe eine Liste von Videodateinamen (das sind Aufnahmen in einem Film). Für jeden gegebenen Schuss möchte ich Duplikate entfernen, basierend auf einem Teil des Pfades (im Bild unten rot eingekreist); nur der mit dem höchsten Wert tk_ sollte in der endgültigen Liste enden.

beispiel Im Bild unten, für Schuss de05_001 nur tk_3 sollte in der Liste landen.

enter image description here

Eingang (mit Dubletten):

raw_list = ['D:\\de05\\de05_001\\postvis\\tk_2\\blasts\\tb205_de05_001.POSTVIS.mov', 
'D:\\de05\\de05_001\\postvis\\tk_3\\blasts\\tb205_de05_001.POSTVIS.mov', 
'D:\\de05\\de05_002\\postvis\\tk_1\\blasts\\tb205_de05_002.POSTVIS.mov', 
'D:\\de05\\de05_017\\postvis\\tk_2\\blasts\\tb205_de05_017.POSTVIS.mov', 
'D:\\de05\\de05_019\\postvis\\tk_2\\blasts\\tb205_de05_019.POSTVIS.mov', 
'D:\\de05\\de05_019\\postvis\\tk_3\\blasts\\tb205_de05_019.POSTVIS.mov', 
'D:\\de05\\de05_019\\postvis\\tk_4\\blasts\\tb205_de05_019.POSTVIS.mov', 
'D:\\de05\\de05_019\\postvis\\tk_1\\blasts\\tb205_de05_019.POSTVIS.mov', ] 

Ausgang (Duplikate entfernt, nur höchste tk_ Zahlen bleiben):

outputList = ['D:\\de05\\de05_001\\postvis\\tk_3\\blasts\\tb205_de05_001.POSTVIS.mov', 
'D:\\de05\\de05_002\\postvis\\tk_1\\blasts\\tb205_de05_002.POSTVIS.mov', 
'D:\\de05\\de05_017\\postvis\\tk_2\\blasts\\tb205_de05_017.POSTVIS.mov', 
'D:\\de05\\de05_019\\postvis\\tk_4\\blasts\\tb205_de05_019.POSTVIS.mov', ] 

Jede Hilfe wäre toll. Vielen Dank.

+1

geben Sie uns ein Beispiel Ein- und Ausgang (im Klartext, nicht Screenshots, kopieren wir können so) – Bahrom

+0

Es gibt auch ein 'tk_4', sollte das nicht derjenige sein, in der am Ende Liste? –

+0

@BubbleHacker Ich weiß, es ist schwer zu sehen, aber das tk_4 ist eine andere Aufnahme -de05_019 (der grün eingekreiste Teil ist anders.). Für diesen Schuss wäre es tatsächlich in der endgültigen Liste, da alle anderen de05_019 eine niedrigere tk_ Nummer haben. – samusugiru

Antwort

1

Eine Möglichkeit wäre, ein Wörterbuch erstellen und halten Sie die Tasten Neuzuweisung, so dass Sie nur mit dem letzten Wert im Verzeichnis am Ende:

import os 

raw_list1 = [ 
    'D:\\\\de05\\de05_019\\postvis\\tk_2\\blasts\\tb205_de05_019.POSTVIS.mov', 
    'D:\\\\de05\\de05_019\\postvis\\tk_3\\blasts\\tb205_de05_019.POSTVIS.mov', 
    'D:\\\\de05\\de05_019\\postvis\\tk_4\\blasts\\tb205_de05_019.POSTVIS.mov', 
    'D:\\\\de05\\de05_019\\postvis\\tk_1\\blasts\\tb205_de05_019.POSTVIS.mov', 
    'D:\\\\tw05\\tw05_036\\postvis\\tk_9\\blasts\\tb205_tw05_036.POSTVIS.mov', 
    'D:\\\\tw05\\tw05_036\\postvis\\tk_13\\blasts\\tb205_tw05_036.POSTVIS.mov' 
] 
raw_list2 = [ 
    'D:\\de05\\de05_001\\postvis\\tk_2\\blasts\\tb205_de05_001.POSTVIS.mov', 
    'D:\\de05\\de05_001\\postvis\\tk_3\\blasts\\tb205_de05_001.POSTVIS.mov', 
    'D:\\de05\\de05_002\\postvis\\tk_1\\blasts\\tb205_de05_002.POSTVIS.mov', 
    'D:\\de05\\de05_017\\postvis\\tk_2\\blasts\\tb205_de05_017.POSTVIS.mov', 
    'D:\\de05\\de05_019\\postvis\\tk_2\\blasts\\tb205_de05_019.POSTVIS.mov', 
    'D:\\de05\\de05_019\\postvis\\tk_3\\blasts\\tb205_de05_019.POSTVIS.mov', 
    'D:\\de05\\de05_019\\postvis\\tk_4\\blasts\\tb205_de05_019.POSTVIS.mov', 
    'D:\\de05\\de05_019\\postvis\\tk_1\\blasts\\tb205_de05_019.POSTVIS.mov', 
] 

def path_split(p, folders=None): 
    folders = folders or [] 
    head, tail = os.path.split(p) 
    if not tail: 
     return folders 
    return path_split(head, [tail] + folders) 

for raw_list in (raw_list1, raw_list2): 
    results = {} 

    for p in raw_list: 
     # Split your path accordingly 
     # For something simple you could have just done s.split('\\'), but since we're working with paths, we might as well use os.path.split 
     shot1, shot2, folder1, take, folder2, file_name = path_split(p) 
     # If something like 'de05_019' defines your shot, make that the key 
     key = shot2 
     # Extract the take number into an integer 
     new_take_num = int(take.split('_')[-1]) 
     # Try finding the take you already stored (default to Nones) 
     existing_take_num, existing_path = results.get(key, (None, None)) 
     # See if the new take is bigger than the existing one, based on the take number. 
     # Lambda is there for comparison, meaning I'm only comparing the take numbers, not the paths. I'll link the docs to max in the comments. 
     value = max((existing_take_num, existing_path), (new_take_num, p), key=lambda take_num_and_path: take_num_and_path[0]) 
     # Assign the value (which is either the existing take, or the new take) 
     results[key] = value 

    for res in sorted(results.values()): 
     print res 
    print '*' * 80 

die Diese Ausgänge (man könnte auch nur nur drucken Pfad):

(4, 'D:\\\\de05\\de05_019\\postvis\\tk_4\\blasts\\tb205_de05_019.POSTVIS.mov') 
(13, 'D:\\\\tw05\\tw05_036\\postvis\\tk_13\\blasts\\tb205_tw05_036.POSTVIS.mov') 
******************************************************************************** 
(1, 'D:\\de05\\de05_002\\postvis\\tk_1\\blasts\\tb205_de05_002.POSTVIS.mov') 
(2, 'D:\\de05\\de05_017\\postvis\\tk_2\\blasts\\tb205_de05_017.POSTVIS.mov') 
(3, 'D:\\de05\\de05_001\\postvis\\tk_3\\blasts\\tb205_de05_001.POSTVIS.mov') 
(4, 'D:\\de05\\de05_019\\postvis\\tk_4\\blasts\\tb205_de05_019.POSTVIS.mov') 
******************************************************************************** 
+0

@samusugiru siehe aktualisierte Antwort – Bahrom

+0

Dank @Bahrom. Ich kann nicht sagen, welcher Teil des Codes nach der Take-Nummer sortiert ist. Kannst du mir das erklären? Ich versuche es mit einem anderen Datensatz und es liefert nicht die Aufnahme mit der höchsten Take-Nummer. – samusugiru

+0

Können Sie den Datensatz posten, mit dem Sie versuchen? – Bahrom

Verwandte Themen