1

我有三个文件夹,名称是["-folder2-", "-folder1-", "=Folder-"].

当我使用“排序”或在 Window 中时,它会返回["-folder-", "-folder1-", "-folder2-"]. 但是使用 natsort,它会返回["-folder1-", "-folder2-", "-folder-"].

我想通过使用 natsort 获得相同的结果我该怎么做?

a = ["-folder1-", "-folder2-", "-folder-"]
import natsort
sorting = natsort.natsorted(a, alg = natsort.ns.PATH | natsort.ns.LOCALE | natsort.ns.IGNORECASE)
print(sorted(a)) #---> ["-folder-", "-folder1-", "-folder2-"]
print(sorting) #---> ["-folder1-", "-folder2-", "-folder-"]
4

1 回答 1

1

在我回答你的问题之前,首先我想解释一下发生了什么。natsort正在您的输入中寻找数字并将它们与非数字成分分开。最简单的方法是查看自然排序键的输出。(我省略了PATHandLOCALE选项,因为它们完全破坏了输出)。

>>> import natsort
>>> ns_key = natsort.natsort_keygen(alg=natsort.IGNORECASE)
>>> a = ["-folder1-", "-folder2-", "-folder-"]
>>> [ns_key(x) for x in a]
[('-folder', 1, '-'), ('-folder', 2, '-'), ('-folder-',)]

'-folder'与 进行比较时'-folder-',根据 Python 的排序启发法,前者被认为是第一个,因此您的带有数字的文件夹会被放置在最前面。

要回答您的问题,我们需要欺骗natsort认为'-'后面没有数字应该像数字的情况一样对待。一种方法是使用正则表达式。

>>> import re
>>> r = re.compile(r"(?<!\d)-")
>>> # What does the regex do?
>>> [r.sub("0\g<0>", x) for x in a]
['0-folder1-', '0-folder2-', '0-folder0-']
>>> # What does natsort generate?
>>> ns_key = natsort.natsort_keygen(key=lambda x: r.sub("0\g<0>", x), alg=natsort.IGNORECASE)
>>> [ns_key(x) for x in a]
[('', 0, '-folder', 1, '-'), ('', 0, '-folder', 2, '-'), ('', 0, '-folder', 0, '-')]
>>> # Does it actually work?
>>> natsort.natsorted(a, key=lambda x: r.sub("0\g<0>", x), alg=natsort.ns.PATH | natsort.ns.LOCALE | natsort.ns.IGNORECASE)
['-folder-', '-folder1-', '-folder2-']

另一种方法是在 上“拆分”您的输入'-',这将产生类似的效果。PATH这是引擎盖下的事情之一,但用于文件分隔符。

>>> # What does natsort generate?
>>> ns_key = natsort.natsort_keygen(key = lambda x: x.split('-'), alg=natsort.IGNORECASE)
>>> [ns_key(x) for x in a]
[((), ('folder', 1), ()), ((), ('folder', 2), ()), ((), ('folder',), ())]
>>> # Does it actually work?
>>> natsort.natsorted(a, key=lambda x: x.split('-'), alg=natsort.ns.PATH | natsort.ns.LOCALE | natsort.ns.IGNORECASE)
['-folder-', '-folder1-', '-folder2-']

您可能想知道为什么PATH不自动处理这个问题。PATH旨在处理由于文件分隔符或文件扩展名而出现的异常情况。你的例子都没有,所以它没有帮助。如果此处给出的示例具有代表性,我建议删除该PATH选项,因为它只会增加运行时间但没有任何好处。

于 2020-03-10T15:06:18.300 回答