簡體   English   中英

根據字母數字日期對目錄列表進行排序

[英]Sort a list of directories based on alphanumerical date

我有一個目錄列表,我想根據日期后跟一個數字對列表進行排序。 以下是未排序列表的示例:

L = ['C:\\Users\\...\\file1\\sample_nov1_1',
    'C:\\Users\\...\\file2\\sample_sep1_1',
    'C:\\Users\\...\\file3\\sample_oct15_2',
    'C:\\Users\\...\\file2\\sample_sep1_2',
     'C:\\Users\\...\\file4\\sample_sep10_2',
    'C:\\Users\\...\\file4\\sample_sep10_1']

我想對其進行排序,以便得到以下輸出:

['C:\\Users\\...\\sample_sep1_1',
 'C:\\Users\\...\\sample_sep1_2',
 'C:\\Users\\...\\sample_sep10_1',
 'C:\\Users\\...\\sample_sep10_2',
 'C:\\Users\\...\\sample_oct15_1',
 'C:\\Users\\...\\sample_nov1_2']

我通過從父目錄中走一遍來得到這個列表,但是因為這些文件不是按照我想要的輸出順序按時間順序創建的,我不確定我是否可以修改那部分代碼。 我已經看過一些其他的答案,比如這個,但它們沒有我在這里遇到的復雜情況。 我怎樣才能做到這一點? 我想使用正則表達式可能會簡化一些,但不確定這是否是正確的方法。

使用以下關鍵方法按字母順序工作

month=['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']
L.sort(key=lambda value:( month.index(value.split('_')[-2][:3]), value.split('_')[-2][3:] , value.split('_')[-1]))
print(L)

這應該有效:

import re

files = ['C:\\Users\\...\\sample_sep1_1',
 'C:\\Users\\...\\sample_sep1_2',
 'C:\\Users\\...\\sample_sep10_1',
 'C:\\Users\\...\\sample_sep10_2',
 'C:\\Users\\...\\sample_nov1_1',
 'C:\\Users\\...\\sample_oct15_2']

lf = [file.split("\\")[-1].split("_") for file in files]

R = []
for index, x in enumerate(lf):
    dval, num = x[1], int(x[2].split(".")[0])
    grps = re.match("([a-z]+)([0-9]+)", dval).groups()
    R.append((grps[0], int(grps[1]), num, files[index]))

month_map = {'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6, 'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12}

sorted_files = sorted(R, key=lambda x: (month_map[x[0]], x[1], x[2]))
print(sorted_files)

輸出:

[('sep', 1, 1, 'C:\\Users\\...\\sample_sep1_1'), ('sep', 1, 2, 'C:\\Users\\...\\sample_sep1_2'), ('sep', 10, 1, 'C:\\Users\\...\\sample_sep10_1'), ('sep', 10, 2, 'C:\\Users\\...\\sample_sep10_2'), ('oct', 15, 2, 'C:\\Users\\...\\sample_oct15_2'), ('nov', 1, 1, 'C:\\Users\\...\\sample_nov1_1')]

到目前為止我得到了這個。 任何其他測試邊緣案例建議?


    month_value = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6,
                   "jul": 7, "aug": 8, "sep": 9, "oct": 10, "nov": 11, "dec": 12}
    out = sorted(a, key=lambda x: (month_value[x.split("\\")[-1][7:][:3]], x.split("\\")[-1][7:][3:].split('_')))

你能試試這個嗎:

import os
from pathlib import Path

paths = sorted(Path("<file_dir>").iterdir(),key=os.path.getmtime)

print(paths)

也許它會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM