2017-01-11 7 views
2

他の2つのリスト間の比較に基づいてリストの要素を返そうとしています。他の2つのリストの比較に基づいてリスト要素を返しますか?

リスト1は、glob.glob(path)を使用して作成されたファイル名のリストです。

リスト2は最初のものと同じですが、datetime.datetime.strptimeを使用してdatetimesに解析されたファイル名を持っています。定義上、最初のリストと同じ長さです。

リスト3のリストは、ファイル名のリストから解析されたdatetimesのリストであるという点で、2番目のリストと同じです。ファイル名のリストは関連していますが、必ずしも同じ長さである必要はありません。

私がしようとしているのは、リスト2の最後の日時に対応するファイル名(リスト1)をリスト3の特定の要素の前に戻すことです。混乱しています。申し訳ありません。

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

直前に発生した「matFileTimes」から日時を返しnext、実装だとして「eventMenu」によって示される日時。 "matFileTime"の日時に対応する "matFiles"の要素を返す最も速いPythonの方法は何ですか?

表示された何かを行うためのより良い方法に関する提案も感謝しています。私はこれで少し新しくなりました。

+1

わからない場合。 'fileToLoad = self.matFiles [self.matFileTimes.index(fileToLoad)]'の追加はどうですか?より扱いやすいアイデアは、別のリストではなく、FileTimes-> Filesというディレクトリ内に物事を保持している可能性があります。 – mkiever

+0

それは実際には動作します。 dictのアイデアには微妙な調整が必要ですが、長期的には価値があるかもしれません。 –

+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)] 
関連する問題