返回列表元素基于另外两个列表的比较?

时间:2017-01-11 17:53:22

标签: python python-2.7

我试图根据另外两个列表之间的比较返回列表元素。

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

列表2与第一个相同,但使用datetime.datetime.strptime将文件名解析为日期时间。根据定义,它与第一个列表的长度相同。

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

我要做的是返回文件名(列表1),该文件名对应于列表2中特定元素之前列表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”指示的日期时间之前发生。返回与“matFileTime”日期时间相对应的“matFiles”元素的最快Pythonic方法是什么?

关于更好地展示任何事物的建议也值得赞赏 - 我对此有点新鲜。

1 个答案:

答案 0 :(得分: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)]