2017-01-11 2 views
2

Ich versuche, das Element einer Liste basierend auf einem Vergleich zwischen zwei anderen Listen zurückzugeben.Zurücklistenelement basierend auf dem Vergleich zweier anderer Listen?

Liste 1 ist eine Liste von Dateinamen, die mit glob.glob(path) erstellt wurden.

Liste 2 ist identisch mit der ersten, hat aber die Dateinamen in Datumswerte unter Verwendung datetime.datetime.strptime analysiert. Es ist per Definition die gleiche Länge wie die erste Liste.

Liste 3 ist wie die zweite, in der es sich um eine Liste von Datumsangaben handelt, die aus einer Liste von Dateinamen geparst werden. Die Listen der Dateinamen sind verwandt, aber nicht notwendigerweise gleich lang.

Ich versuche, den Dateinamen (Liste 1), die der letzten Datetime in Liste 2 entspricht, vor einem bestimmten Element der Liste 3 zurückzugeben. Es ist verwirrend, ich weiß. Das tut mir leid.

Ich weiß, dass next eine schnelle Möglichkeit ist, Werte aus einer Liste basierend auf Vergleichen zurückzugeben, aber ich habe keine Möglichkeit gefunden, um einen Wert aus einer Liste außerhalb des Vergleichs zu verwenden.

Hier ist, was ich habe:

# get list of mat files and extract corresponding times 
matFiles = [] 
matFileTimes = [] 
matFilePattern = re.compile('\\.*(\w*\s*\w*\s*)(\d+.\d+.\d+\s+\d+.\d+.\d+.\d+)(\s*\w*\s*\d*)?\.mat$') 
for name in glob.glob(filePath[0] + '\*.mat'): 
    event = re.search(matFilePattern, name) 
    matFiles.append(event.group(0)) 
    matFileTimes.append(datetime.datetime.strptime(event.group(2),'%Y-%m-%d %H-%M-%S-%f')) 

self.matFiles = sorted(matFiles)    
self.matFileTimes = sorted(matFileTimes) 

if 'audio' in listdir(filePath[0]): 
    audioFiles = [] 
    audioFileTimes = [] 
    audioFilePattern = re.compile('\\.*(\w*\s*\w*\s*)(\d+.\d+.\d+\s+\d+.\d+.\d+.\d+)?\.wav$') 
    for name in glob.glob(path.join(filePath[0], 'audio') + '\*.wav'): 
     audioEvent = re.search(audioFilePattern, name) 
     audioFiles.append(audioEvent.group(0)) 
      audioFileTimes.append(datetime.datetime.strptime(audioEvent.group(2),'%Y-%m-%d %H-%M-%S-%f')) 

    self.audioFiles = sorted(audioFiles) 
    self.audioFileTimes = sorted(audioFileTimes) 

    for each in audioFileTimes: 
     self.eventMenu.addItem(datetime.datetime.strftime(each, '%b %d %Y, %I:%M:%S %p')) 
else: 
    for each in matFileTimes: 
     self.eventMenu.addItem(datetime.datetime.strftime(each, '%b %d %Y, %I:%M:%S %p')) 

später dann (in einer anderen Klasse-Funktion):

if 'audio' in listdir(self.filePath): 
      fileToLoad = next(dt for dt in reversed(self.matFileTimes) if dt <= self.audioFileTimes[self.eventMenu.currentIndex()]) 

Wie es implementiert ist, next die Datetime aus "matFileTimes" zurückgibt, die zu unmittelbar vor auftritt die vom "eventMenu" angegebene Datumzeit. Was ist die schnellste Pythonic-Methode, um das Element "matFiles" zurückzugeben, das der "matFileTime" -Datetime entspricht?

Vorschläge zu besseren Möglichkeiten, etwas gezeigt zu tun, werden auch geschätzt - ich bin ein bisschen neu dabei.

+1

nicht sicher, ob ich das richtig verstanden. Wie wäre es mit dem Hinzufügen von 'fileToLoad = self.matFiles [self.matFileTimes.index (fileToLoad)]'. Eine Idee für eine einfachere Handhabung ist vielleicht das Speichern von Dateien in einem dict FileTimes-> Dateien statt separaten Listen. – mkiever

+0

Das funktioniert eigentlich. Die dict-Idee würde einige Optimierungen erfordern, aber es könnte sich auf lange Sicht lohnen. –

+0

Also habe ich es in eine Antwort verwandelt. Korrigiert den Variablennamen auf dem Weg. – mkiever

Antwort

1

Der schnellste Weg, um ein Ergebnis wird mit dem Index des Datei Zeitelementes und bekommt das Element mit dem gleichen Index der Dateinamensliste zu bekommen:

if 'audio' in listdir(self.filePath): 
    timeToLoad = next(dt for dt in reversed(self.matFileTimes) if dt <= self.audioFileTimes[self.eventMenu.currentIndex()]) 
    fileToLoad = self.matFiles[self.matFileTimes.index(timeToLoad)]