社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python数组排序文件夹名称

Eddie Webb • 3 年前 • 1346 次点击  

嗨,有人能给我解释一下如何按创建顺序对文件夹名称进行排序吗?

    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)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133723
 
1346 次点击  
文章 [ 4 ]  |  最新文章 3 年前
N. Arunoprayoch
Reply   •   1 楼
N. Arunoprayoch    3 年前

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

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']
Tyler Maran
Reply   •   2 楼
Tyler Maran    3 年前

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

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

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 ).

Juan Facundo Peña
Reply   •   3 楼
Juan Facundo Peña    3 年前

由于列表中的项目都是字符串,“排序”按字母顺序对项目进行排序。所有字符串都以“New folder”开头。

第一个项目就在那里结束了,所以这是第一个项目。第二个显然是“新文件夹1”。第三个是“新文件夹10”,因为按照字母顺序,项目是逐字符读取的,“新文件夹10”的11字符是“1”,而“新文件夹2”的11字符是“2”。

我想有很多方法可以解决你的问题,其中一种可能是:

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

编辑:我的回答被两位成员纠正了。首先,要使用的函数是 sorted sort .

接下来,我的代码将引发一个“新文件夹”错误,该文件夹缺少int,因为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))
Freddy Mcloughlan
Reply   •   4 楼
Freddy Mcloughlan    3 年前

使用 sorted() 返回已排序对象的副本。你只是把整理好的副本退回,什么也不做。你需要 .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']

编辑:

为了解释信件:

list1 = ["Abc 1", "Abc 10", "Abc", "Test", "Test 20", "New folder",
         "New folder 1", "New folder 10", "New folder 2"]


def order(x):
    try:
        return x + re.search("\d+", x).group(0)
    except (ValueError, TypeError, AttributeError):
        return x


list1.sort(key=list)
output  ['Abc', 'Abc 1', 'Abc 10', 'New folder', 'New folder 1', 'New folder 10', 'New folder 2', 'Test', 'Test 20']

还有你的另一个问题。在拥有所有文件夹名称后进行排序,而不是在添加它们时进行排序。