python - 优化代码:仅返回 python 列表的最高版本文件名
问题描述
下面是一些文件名的列表。每个文件都包含一个 3D 对象的名称和一个版本号。我编写了一些 Python 代码来仅提取每个对象的版本号最高的文件名:
def list_all_objects(filenames_list):
all_objects = []
for name in filenames_list:
object, version = split_filename(name, '_')
if object not in all_objects:
all_objects.append(object)
return all_objects
def get_highest_version(objects_list, filenames_list):
all_items_all_versions = [] # list of dictionaries
highest_version_files = []
for item in all_objects:
item_all_versions = dict()
for name in filenames:
object, version = split_filename(name, '_')
if item in name:
item_all_versions[version] = name
all_items_all_versions.append(item_all_versions)
for dictionary in all_items_all_versions:
highest_version = max(dictionary.keys())
highest_version_files.append(dictionary.get(highest_version))
return highest_version_files
def split_filename(name_str, separator):
filename, ext = name_str.split('.')
return filename.split(separator)
filenames = (
'object1_001.ext',
'object1_245.ext',
'object1_003.ext',
'object2_001.ext',
'object2_010.ext',
'object3_067.ext',
'object3_142.ext'
)
all_objects = list_all_objects(filenames)
# print(all_objects)
highest_version_files = get_highest_version(all_objects, filenames)
print(highest_version_files)
回报:
['object1_245.ext', 'object2_010.ext', 'object3_142.ext']
我的代码对我来说似乎很复杂。很高兴看到一个或多个示例,说明如何以更简单的方式仅返回每个对象的最高版本文件。
解决方案
您无需运行列表两次即可获取对象
def get_object(filename):
return filename.split("_")[0]
def get_version(filename):
return int(filename.split("_")[1].split(".")[0])
def get_highest_version(filenames):
fileDict = {}
for filename in filenames:
obj = get_object(filename)
if (obj not in fileDict):
fileDict[obj] = filename
else:
current_version = get_version(fileDict[obj])
new_version = get_version(filename)
if (new_version > current_version):
fileDict[obj] = filename
return list(fileDict.values())
推荐阅读
- javascript - 为什么当我在 angularjs 中使用 ES6 语法时 gulp-uglify 不起作用
- javascript - javascript 不返回所需的值
- java - 如何在 Scala 中为 Kafka (ConsumerRebalanceListener) 实现 Java 接口?
- vba - 查找和替换表中的值
- html - 做一个
标签更易于访问
- c# - 使用多个文本框进行 SQL LIKE 搜索?
- git - 正确删除 git 历史记录,无需任何后续参考
- azure - 使用 Ajax 调用经过 Active Directory 身份验证的 Web api
- oracle - ORA-00955: 名称已被现有对象使用;使用 Oracle.ManagedDataAccess 和 EntityFramework 时
- github - 什么是 github 中的构建和传递按钮?