以特定方式对文件排序

时间:2018-11-26 12:31:27

标签: python algorithm function sorting lambda

目录中有文件列表,现在我打算将内容保存到数据库中。但是,在此之前,我需要按正确的顺序对其进行排序。

当前排序如下:

['8.txt', '8-0.txt', '8-1.txt', '8-2.txt', '8-0-0.txt', '8-0-1.txt',
 '8-0-2.txt', '8-0-3.txt', '8-1-0.txt', '8-2-0.txt', '8-2-1.txt']

我希望他们按如下顺序订购:

['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt', 
 '8-1.txt', '8-1-0.txt', '8-2.txt', '8-2-0.txt', '8-2-1.txt']

基本上,将这些文件视为帖子,评论和答复。

第一个没有任何破折号的文件'8.txt'是原始帖子。随后,我们有一组评论,例如'8-0.txt','8-1.txt'等,即文件名中的一个破折号。最后,对于每个评论,可能都会有一些答复,其名称格式为“ 8-2-0.txt”,“ 8-2-1.txt”(2个破折号)。

虽然我知道蛮力方式绝对可以执行这种排序,但我想知道是否存在任何Python方式(例如,用于排序的lambda函数)

目前,我们可以假设文件名中最多只能包含2个破折号,即不超过3个层次结构。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

困难在于正确排序类似于

的内容
8-1-12.txt   # simply removing non digits ==> 8112 
8-11-2.txt   # simply removing non digits ==> 8112 as well

简便的解决方案是利用tuple-排序:

f = ['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt', 
     '8-1.txt', '8-1-0.txt', '8-2.txt', '8-2-0.txt', '8-2-1.txt','8-12-0.txt',
     '8-1-12.txt', '8-11-2.txt']

def to_tuple(text):
    """Extract all numbers from file as tuple (8,1,3) ... etc."""
    return tuple(map(int, text.split(".")[0].split("-") ))

f.sort(key = to_tuple)
print(f)

输出:

['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt', 
 '8-1.txt', '8-1-0.txt', '8-1-12.txt', 
 '8-2.txt', '8-2-0.txt', '8-2-1.txt', 
 '8-11-2.txt', '8-12-0.txt']

如果您的姓名包含不可整数转换的内容,则需要使用try: except:并优化to_tuple()函数以正确处理您的姓名。

答案 1 :(得分:0)

Natural sorting包括其他内容。