1. 程式人生 > 實用技巧 >python實現根據影象路徑排序

python實現根據影象路徑排序

  • 實現功能:輸入為影象路徑列表,根據影象名稱中的數字大小實現影象路徑的排序
from functools import cmp_to_key

def get_suffix(filename):
    """a.jpg -> jpg"""
    pos = filename.rfind('.')
    if pos == -1:
        return ''
    return filename[pos:]

'''
求兩個字串的最長公共子串
思想:建立一個二維陣列,儲存連續位相同與否的狀態
'''
def get_num_of_common_substr(str1, str2):
  
 lstr1 = len(str1)
 lstr2 = len(str2)
 record = [[0 for i in range(lstr2+1)] for j in range(lstr1+1)] # 多一位
 maxNum = 0   # 最長匹配長度
 p = 0    # 匹配的起始位
  
 for i in range(lstr1):
  for j in range(lstr2):
   if str1[i] == str2[j]:
    # 相同則累加
    record[i+1][j+1] = record[i][j] + 1
    if record[i+1][j+1] > maxNum:
     # 獲取最大匹配長度
     maxNum = record[i+1][j+1]
     # 記錄最大匹配長度的終止位置
     p = i + 1
 return str1[p-maxNum:p]

#給出一個絕對路徑格式 .../.../color1.png .../.../color20.png 找到影象名中數字的位置,比較數字大小
def sort_by_index(str1,str2):
    suffix = get_suffix(str1)   
    str_1 = str1.split("/")[-1].replace(f'{suffix}',"")
    str_2 = str2.split("/")[-1].replace(f'{suffix}',"")  
    sub_str = get_num_of_common_substr(str_1,str_2)   
    int_str1 = int(str_1.replace(f'{sub_str}',"")) if len(str_1.replace(f'{sub_str}',"")) else 0
    int_str2 = int(str_2.replace(f'{sub_str}',"")) if len(str_2.replace(f'{sub_str}',"")) else 0
    return int_str1-int_str2

if __name__ == '__main__':
    str_list = ["a/b/c/color15.png","a/b/c/color2.png","a/b/c/color13.png","a/b/c/color1.png"]
    str_list.sort(key=cmp_to_key(sort_by_index))
    print(str_list)