Python 数组排序文件夹名称

Python Arrays sorting folder names

嗨,谁能向我解释如何按创建顺序对文件夹名称进行排序?

    list1=["New folder", "New folder 1", "New folder 10", "New folder 2"]

    sorted(list1)
    print("output ",list1)

目前的输出是:

>>  ["New folder", "New folder 1", "New folder 10", "New folder 2"]

我希望它显示:

["New folder", "New folder 1", "New folder 2", "New folder 10"]

我需要这个顺序的原因是因为我按顺序通过这些文件夹名称打开目录。

下面是我用来获取这些文件夹名称的代码,也许有一种方法可以在我制作数组时按要求的顺序对它们进行排序?

     itrprev = iter(os.walk(previousdir))
        root, dirs, files = next(itrprev)     
    for next_root, next_dirs, next_files in itrprev:  # get second element onwards
        print("Next dir full path: : ", next_root)
        singlefoldername = os.path.split(next_root)
        fullfoldername = os.path.abspath(next_root)

它按字母顺序对这些文件夹进行排序,因为这里的值是字符串。

作为字符串,正确的顺序是:

New folder 1
New folder 10
New folder 2

因此,如果您不知道文件夹的开头格式,这可能是个难题。

最简单的解决方案是重命名文件夹:

New folder 01
New folder 02
New folder 10

但是,如果您没有标准的命名格式(有些文件夹有编号,有些没有),那么您必须有条件地在编号处拆分字符串。解析数字上的 int,并使用它来翻转位置。 但是,如果您开始在字符串之间添加数字 ("New 1 Folder"),或者特别是如果您有任何带有日期的内容 (New Folder 3-20-2021),那么这也会变得非常奇怪。

使用sorted() returns 已排序对象的副本。您只是返回排序后的副本,什么也不做。您需要 .sort() 来修改字符串。

您还需要创建一个关键函数来指定您按末尾的数字而不是字母数字排序。

import re

def order(x):
    try:
        # This searches and returns the first number found in the folder name
        return int(re.search("\d+", x).group(0))
    except (ValueError, TypeError, AttributeError):
        return 0


list1.sort(key=order)
output  ['New folder', 'New folder 1', 'New folder 2', 'New folder 10']

编辑 - 也考虑字母:

请参阅附件答案。

And have a read through the thread for alternatives


以及您的其他查询。在获得所有文件夹名称后排序,而不是在添加它们时排序。

由于列表中的项目都是字符串,因此“sorted”按字母顺序对项目进行排序。所有字符串都以“新文件夹”开头。

第一项就在那里,所以排在第一位。第二个显然是“新文件夹 1”。第三个是“新文件夹 10”,因为按字母顺序意味着逐个字符读取项目,“新文件夹 10”的第 11 个字符是“1”,“新文件夹 2”的第 11 个字符是“2”。

(我猜)有很多方法可以解决您的问题,其中一种可能是:

sorted_list = sorted(list1, key=lambda x: int(x.split(" ")[-1]))

编辑:我的回答已被 2 位成员正确纠正。首先,要使用的函数是 sorted 而不是 sort.

接下来,我的代码将引发错误,因为“新文件夹”缺少一个整数,因为 lambda 将尝试将“文件夹”转换为数字。

你可以试试:

def sorter(x):
    try:
        i = int(x.split(" ")[-1])
        return i
    except ValueError:
        return 0

sorted_list = sorted(list1, key=lambda x: sorter(x))

您需要创建自定义排序函数。该函数将检查每个名称的末尾是否为有序数字,然后进行相应的排序。默认为 A​​SC.

def customer_sort(foldername):
    foldername_list = foldername.split(' ')
    if not foldername_list[-1].isnumeric():
        return 0
    return int(foldername_list[-1])

结果

list1 = ["New folder", "New folder 1", "New folder 10", "New folder 2"]
sorted(list1, key= lambda item: customer_sort(item))
# ['New folder', 'New folder 1', 'New folder 2', 'New folder 10']