目录中有文件列表,现在我打算将内容保存到数据库中。但是,在此之前,我需要按正确的顺序对其进行排序。
当前排序如下:
['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个层次结构。
任何帮助将不胜感激!
答案 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包括其他内容。