我想基於兩個其他列表之間的比較來返回列表的元素。基於兩個其他列表的比較返回列表元素?
表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」元素?更好的方法可以做到什麼表現
建議也讚賞 - 我在這個有點新。
不知道我理解正確。如何添加'fileToLoad = self.matFiles [self.matFileTimes.index(fileToLoad)]'。一個更容易處理的想法可能是把文件保存在一個字典FileTimes-> Files而不是單獨的列表中。 – mkiever
實際上,這起作用。字典的想法需要一些調整,但從長遠來看,這可能是值得的。 –
所以我把它變成了答案。在途中更正了變量名稱。 – mkiever