首页 > 解决方案 > 优化代码:仅返回 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']

我的代码对我来说似乎很复杂。很高兴看到一个或多个示例,说明如何以更简单的方式仅返回每个对象的最高版本文件。

标签: python

解决方案


您无需运行列表两次即可获取对象

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

推荐阅读