返回基于两个其他列表的比较的列表元素?

2024-10-01 11:38:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试基于两个其他列表之间的比较返回列表的元素。你知道吗

列表1是使用glob.glob(path)创建的文件名列表。你知道吗

列表2与第一个相同,但是使用datetime.datetime.strptime将文件名解析为datetimes。根据定义,它与第一个列表的长度相同。你知道吗

列表3与第二个列表类似,因为它是从文件名列表中解析出来的日期时间列表。文件名列表是相关的,但长度不一定相同。你知道吗

我要做的是返回文件名(列表1),它对应于列表2中列表3的特定元素之前的最后一个datetime。我知道这很混乱。很抱歉。你知道吗

我知道使用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”返回datetime,该datetime出现在“eventMenu”指示的datetime之前。返回“matFiles”元素(对应于“matFileTime”datetime)的最快Pythonic方法是什么?你知道吗

建议更好的方法来做任何显示也很感激-我在这方面有点新。你知道吗


Tags: 方法nameinselfre列表fordatetime
1条回答
网友
1楼 · 发布于 2024-10-01 11:38:32

获取结果的最快方法是使用文件时间元素的索引,并获取与文件名列表具有相同索引的元素:

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)]

相关问题 更多 >