python - 以特定方式对文件进行排序

标签 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 个破折号)。

虽然我知道蛮力方式绝对可以进行这种排序,但我想知道是否有任何 Pythonic 方式(例如排序函数中的一些 lambda 函数)

现在我们可以假设文件名中最多只有 2 个破折号,即不超过 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() 函数以正确处理您的名称。

关于python - 以特定方式对文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53481190/

相关文章:

python - 如何使用无监督方法将句子分类到预定义的主题桶之一

python - 如何处理控制台退出和对象销毁

c++ - 为有序链表 C++ 编写插入算法

mysql - 如何在事务中包装 mysql 存储函数

python - 有没有类似 Lisp 的 SLIME for Python/Django 的东西?

python - Pandas read_excel 百分比作为字符串

c++ - 以字符串 vector 为值的 hashMap

c - C 中的循环挑战 : can it be done another way?

python - 5.3.2 : Function call in expression Python

qt - 尝试将 shell 命令的实时/实时输出作为字符串数据从函数返回到主函数