您可以通过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
是一个字典,文件名不带扩展名作为键,命名元组的值包含文件完整文件名和修改日期。如果遇到的新文件在字典中,则将其日期与存储在字典中的日期进行比较,并在必要时进行替换。
最后,您有一本包含最新文件的字典。
然后您可以使用此列表执行第二遍。请注意,字典中的查找复杂度为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在评论中所建议的那样,您甚至可以避免第二遍并在遇到新文件时立即删除旧文件,只需添加一行代码:
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