如何按升序对目录列表进行排序?
How Can I Sort a List of Directories By Ascending Order?
背景
我真的很想重命名 16,494,000 个文件,这些文件都以站点编号(1 到 15,000)和类别编号(1 到 8)结尾。为此,我想遍历文件并重命名它们。 问题 是我不知道如何在我的列表中对这些文件路径进行排序。
首先,我使用它来获取我的 CWD 中的文件路径列表:
import os
import shutil
from pathlib import Path
import glob
lst = os.listdir(os.getcwd())
然后我得到一个非常随机的列表。它通常从 10,000_1 开始。我将提供一个简短版本的列表作为示例。
lst = ['10000_1.txt','10000_2.txt','10000_3.txt','10000_4.txt','10000_5.txt','10000_6.txt','10000_7.txt','10000_8.txt',
'1000_1.txt','1000_2.txt','1000_3.txt','1000_4.txt','1000_5.txt','1000_6.txt','1000_7.txt','1000_8.txt',
'16494_1.txt','16494_2.txt','16494_3.txt','16494_4.txt','16494_5.txt','16494_6.txt','16494_7.txt','16494_8.txt',
'100_1.txt','100_2.txt','100_3.txt','100_4.txt','100_5.txt','100_6.txt','100_7.txt','100_8.txt',
'1_1.txt','1_2.txt','1_3.txt','1_4.txt','1_5.txt','1_6.txt','1_7.txt','1_8.txt']
简而言之,我们这里有 5 个站点,有 8 个类别编号:1_(1 到 8)、100_(1 到 8)、1000_(1 到 8)、10000_(1 到 8)和 16494_(1 到 8) 8).它们都是.txt.
我试过的
lst = lst.sort()
print(lst)
我不知道该怎么办。我已经尝试过其他东西,但我什么也没得到,或者它没有对任何东西进行排序。我希望它看起来像这样:
我想要的
lst = ['1_1.txt','1_2.txt','1_3.txt','1_4.txt','1_5.txt','1_6.txt','1_7.txt','1_8.txt',
'100_1.txt','100_2.txt','100_3.txt','100_4.txt','100_5.txt','100_6.txt','100_7.txt','100_8.txt',
'1000_1.txt','1000_2.txt','1000_3.txt','1000_4.txt','1000_5.txt','1000_6.txt','1000_7.txt','1000_8.txt',
'10000_1.txt','10000_2.txt','10000_3.txt','10000_4.txt','10000_5.txt','10000_6.txt','10000_7.txt','10000_8.txt',
'16494_1.txt','16494_2.txt','16494_3.txt','16494_4.txt','16494_5.txt','16494_6.txt','16494_7.txt','16494_8.txt']
如有任何帮助,我们将不胜感激!
您需要使用自定义键进行排序:
>>> sorted(lst, key=lambda x: (int(x.split("_")[0]), int(x.split("_")[1].split(".")[0])))
或者:
>>> sorted(lst, key=lambda x: tuple(map(int, x.rstrip(".txt").split("_"))))
def sort_rule(filename):
return filename.split('_')[0]
list.sort(key=sort_rule)
我认为您需要做的就是查找站点编号。具有相同站点编号的值将按类别排序。
您可以简单地使用拆分字符串作为键:
sorted(lst, key=lambda x: x.split('_'))
输出:
['1_1.txt', '1_2.txt', '1_3.txt', '1_4.txt', '1_5.txt', '1_6.txt', '1_7.txt', '1_8.txt', '100_1.txt', '100_2.txt', '100_3.txt', '100_4.txt', '100_5.txt', '100_6.txt', '100_7.txt', '100_8.txt', '1000_1.txt', '1000_2.txt', '1000_3.txt', '1000_4.txt', '1000_5.txt', '1000_6.txt', '1000_7.txt', '1000_8.txt', '10000_1.txt', '10000_2.txt', '10000_3.txt', '10000_4.txt', '10000_5.txt', '10000_6.txt', '10000_7.txt', '10000_8.txt', '16494_1.txt', '16494_2.txt', '16494_3.txt', '16494_4.txt', '16494_5.txt', '16494_6.txt', '16494_7.txt', '16494_8.txt']
另一种选择是使用 natsorted
from natsort import natsorted
natsorted(lst)
背景
我真的很想重命名 16,494,000 个文件,这些文件都以站点编号(1 到 15,000)和类别编号(1 到 8)结尾。为此,我想遍历文件并重命名它们。 问题 是我不知道如何在我的列表中对这些文件路径进行排序。
首先,我使用它来获取我的 CWD 中的文件路径列表:
import os
import shutil
from pathlib import Path
import glob
lst = os.listdir(os.getcwd())
然后我得到一个非常随机的列表。它通常从 10,000_1 开始。我将提供一个简短版本的列表作为示例。
lst = ['10000_1.txt','10000_2.txt','10000_3.txt','10000_4.txt','10000_5.txt','10000_6.txt','10000_7.txt','10000_8.txt',
'1000_1.txt','1000_2.txt','1000_3.txt','1000_4.txt','1000_5.txt','1000_6.txt','1000_7.txt','1000_8.txt',
'16494_1.txt','16494_2.txt','16494_3.txt','16494_4.txt','16494_5.txt','16494_6.txt','16494_7.txt','16494_8.txt',
'100_1.txt','100_2.txt','100_3.txt','100_4.txt','100_5.txt','100_6.txt','100_7.txt','100_8.txt',
'1_1.txt','1_2.txt','1_3.txt','1_4.txt','1_5.txt','1_6.txt','1_7.txt','1_8.txt']
简而言之,我们这里有 5 个站点,有 8 个类别编号:1_(1 到 8)、100_(1 到 8)、1000_(1 到 8)、10000_(1 到 8)和 16494_(1 到 8) 8).它们都是.txt.
我试过的
lst = lst.sort()
print(lst)
我不知道该怎么办。我已经尝试过其他东西,但我什么也没得到,或者它没有对任何东西进行排序。我希望它看起来像这样:
我想要的
lst = ['1_1.txt','1_2.txt','1_3.txt','1_4.txt','1_5.txt','1_6.txt','1_7.txt','1_8.txt',
'100_1.txt','100_2.txt','100_3.txt','100_4.txt','100_5.txt','100_6.txt','100_7.txt','100_8.txt',
'1000_1.txt','1000_2.txt','1000_3.txt','1000_4.txt','1000_5.txt','1000_6.txt','1000_7.txt','1000_8.txt',
'10000_1.txt','10000_2.txt','10000_3.txt','10000_4.txt','10000_5.txt','10000_6.txt','10000_7.txt','10000_8.txt',
'16494_1.txt','16494_2.txt','16494_3.txt','16494_4.txt','16494_5.txt','16494_6.txt','16494_7.txt','16494_8.txt']
如有任何帮助,我们将不胜感激!
您需要使用自定义键进行排序:
>>> sorted(lst, key=lambda x: (int(x.split("_")[0]), int(x.split("_")[1].split(".")[0])))
或者:
>>> sorted(lst, key=lambda x: tuple(map(int, x.rstrip(".txt").split("_"))))
def sort_rule(filename):
return filename.split('_')[0]
list.sort(key=sort_rule)
我认为您需要做的就是查找站点编号。具有相同站点编号的值将按类别排序。
您可以简单地使用拆分字符串作为键:
sorted(lst, key=lambda x: x.split('_'))
输出:
['1_1.txt', '1_2.txt', '1_3.txt', '1_4.txt', '1_5.txt', '1_6.txt', '1_7.txt', '1_8.txt', '100_1.txt', '100_2.txt', '100_3.txt', '100_4.txt', '100_5.txt', '100_6.txt', '100_7.txt', '100_8.txt', '1000_1.txt', '1000_2.txt', '1000_3.txt', '1000_4.txt', '1000_5.txt', '1000_6.txt', '1000_7.txt', '1000_8.txt', '10000_1.txt', '10000_2.txt', '10000_3.txt', '10000_4.txt', '10000_5.txt', '10000_6.txt', '10000_7.txt', '10000_8.txt', '16494_1.txt', '16494_2.txt', '16494_3.txt', '16494_4.txt', '16494_5.txt', '16494_6.txt', '16494_7.txt', '16494_8.txt']
另一种选择是使用 natsorted
from natsort import natsorted
natsorted(lst)