我有一个脚本来移动项目,并对其执行一些基本功能。它依赖于列表.排序()以确保文件放在正确的位置。你知道吗
例如,我有11个文件:
A1_S1_ETC.ext
A2_S2_ETC.ext
...
...
A10_S10_ETC.ext
A11_S11_ETC.ext
该脚本要求一个路径和输出,在此基础上,我使用os和glob创建两个排序列表:
pathA = raw_input()
listA = list(glob.glob(os.path.join(path,'*.ext')))
listA.sort()
outp = raw_input()
outp.sort()
filen = [x.split(pathA)[1].split('_')[0] for x in listA]
filen.sort()
outp1 = [pathA + s + '/' for s in filen]
outp1.sort()
但印刷时:
print listA
['A10_S10_ETC.ext', 'A11_S11_ETC.ext','A1_S1_ETC.ext',, A2_S2_ETC.ext']
print outp1
['/user/path/A1/', '/user/path/A10/', '/user/path/A11/', '/user/path/A2/']
我猜是文件名中的'\u SXX'部分影响了排序功能?我不在乎它是如何排序的,只要A1文件进入A1目录——不仅仅是为了这个命名法,而是为了任何可能的字符串。你知道吗
有没有一种方法可以做到这一点-也许通过要求list.sort
函数排序直到第一个下划线?你知道吗
你想要的是自然排序。看看这个帖子:Does Python have a built in function for string natural sort?
在python中对字符串进行排序是一种词典排序。字符串按字典顺序进行比较。所以
'A10'
和'A11'
排在'A1_'
之前。你知道吗您可以通过以下方式获得预期行为:
所发生的是,排序是字典式的,根据ASCII码对ASCII字符进行排序。这里我们有
'0'
的ASCII码是48
,而'_'
的ASCII码是95,这意味着'0' < '_'
。你知道吗为了获得一致性,您可以提供一个一致的比较函数。例如:
这里的问题是在比较字符串之前使用相同的转换。你知道吗
这依赖于这样一种情况,因为你去掉了信息,你可能会去掉太多的信息,使元素变得不同,但在你的例子中,这意味着
outp1
的两个元素无论如何都会变得相同,所以这在这里并不重要。你知道吗否则,必须在转换名称之前应用排序。这意味着不排序
filen
或outp1
(因为这样它们的顺序将依赖于listA
的顺序)。你知道吗相关问题 更多 >
编程相关推荐