あなたはO(n)
複雑にそれを行うことができます。のソリューションsort
はO(n*log(n))
複雑です。
import os
from collections import namedtuple
directory = #file directory
os.chdir(directory)
newest_files = {}
Entry = namedtuple('Entry',['date','file_name'])
for file_name in os.listdir(directory):
name,ext = os.path.splitext(file_name)
cashed_file = newest_files.get(name)
this_file_date = os.path.getmtime(file_name)
if cashed_file is None:
newest_files[name] = Entry(this_file_date,file_name)
else:
if this_file_date > cashed_file.date: #replace with the newer one
newest_files[name] = Entry(this_file_date,file_name)
newest_files
は、ファイルの完全なファイル名と変更日を保持する名前付きタプルの値を持つキーとして、拡張子のないファイル名を持つ辞書です。検出された新しいファイルが辞書内にある場合、その日付は辞書に保存されているファイルと比較され、必要に応じて置き換えられます。
最終的には、最新のファイルを含む辞書ができあがります。
次に、このリストを使用して2番目のパスを実行できます。辞書でのルックアップの複雑さはであることに注意してくださいO(1)
。n
したがって、辞書内のすべてのファイルを検索する全体的な複雑さはですO(n)
。
たとえば、同じ名前の最新のファイルのみを残し、他のファイルを削除する場合、これは次の方法で実行できます。
for file_name in os.listdir(directory):
name,ext = os.path.splitext(file_name)
cashed_file_name = newest_files.get(name).file_name
if file_name != cashed_file_name: #it's not the newest with this name
os.remove(file_name)
コメントでBlckknghtが示唆しているように、コードを1行追加するだけで、2番目のパスを回避し、新しいファイルに遭遇したらすぐに古いファイルを削除することもできます。
else:
if this_file_date > cashed_file.date: #replace with the newer one
newest_files[name] = Entry(this_file_date,file_name)
os.remove(cashed_file.file_name) #this line added