我有一个脚本来移动项目并对它们执行一些基本功能。它依赖于list.sort()来确保文件到达正确的位置。
例如我有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/']
我猜它是' _SXX'部分文件名影响排序功能?我不在乎它是如何排序的,只要A1文件进入A1目录 - 不仅仅是为了这个命名法,而是任何可能的字符串。
有没有办法做到这一点 - 也许通过要求list.sort
函数排序直到第一个下划线?
答案 0 :(得分:1)
在python中对字符串进行排序是一种词典排序。字符串按字典顺序进行比较。因此'A10'
和'A11'
出现在'A1_'
之前。
您可以使用以下方式获得您期望的行为:
lst.sort(key=lambda x: int(x.split('_')[0][1:])
答案 1 :(得分:1)
根据ASCII码,排序是按字典顺序排列的ASCII字符。这里我们'0'
的ASCII代码是48
,而'_'
的ASCII代码是95 - 这意味着'0' < '_'
。
您可以做的是获得一致性是提供一致的比较功能。例如:
def mycmp(s1, s2):
s1 = s1.split(pathA)[1].split('_')[0]
s2 = s2.split(pathA)[1].split('_')[0]
return cmp(s1, s2)
outp1.sort(cmp=mycmp)
这就是你在比较字符串之前使用相同的转换。
这取决于你,因为你剥离了信息,你可能会剥夺太多的东西以使元素不同,但在你的情况下,这意味着outp1
的两个元素无论如何都会变得相同,所以它不会#39在这里很重要。
否则,您必须在转换名称之前应用排序。这意味着不对filen
或outp1
进行排序(因为那时他们的顺序将依赖于listA
的顺序。
答案 2 :(得分:1)
您想要的是自然排序。请参阅此主题:Does Python have a built in function for string natural sort?