2017-01-11 75 views
2

我想基於兩個其他列表之間的比較來返回列表的元素。基於兩個其他列表的比較返回列表元素?

表1是使用glob.glob(path)創建的文件名列表。

列表2是相同的第一,但具有解析成使用datetime.datetime.strptime日期時間的文件名。它的定義與第一個列表的長度相同。

表3列表是類似於第二,因爲它是從文件名列表解析日期時間的列表。文件名列表是相關的,但不一定是相同的長度。

我所試圖做的是對應的文件名(表1)之前列表3.這是令人困惑的一個特定的元素返回到最後日期時間在表2中,我知道了。對於那個很抱歉。

我都知道,使用next是一種快速的方法來從基於比較列表返回值,但我還沒有找到一種方法,用它來比較外部列表返回一個值。

這是我有:

# 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')) 

再後來(在不同類的函數):

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

,因爲它的實施,next從發生前夕「matFileTimes」返回日期由「eventMenu」指示的日期時間。什麼是最快的Pythonic方式來返回與「matFileTime」日期時間相對應的「matFiles」元素?更好的方法可以做到什麼表現

建議也讚賞 - 我在這個有點新。

+1

不知道我理解正確。如何添加'fileToLoad = self.matFiles [self.matFileTimes.index(fileToLoad)]'。一個更容易處理的想法可能是把文件保存在一個字典FileTimes-> Files而不是單獨的列表中。 – mkiever

+0

實際上,這起作用。字典的想法需要一些調整,但從長遠來看,這可能是值得的。 –

+0

所以我把它變成了答案。在途中更正了變量名稱。 – mkiever

回答

1

得到的結果是使用文件時,元素的索引,並以文件名列表的同一指標獲得元素的最快方法:

如果
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)] 
相關問題