Python列表排序为预期输出创建不同的顺序

时间:2015-12-12 10:10:25

标签: python list sorting

我有一个脚本来移动项目并对它们执行一些基本功能。它依赖于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函数排序直到第一个下划线?

3 个答案:

答案 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在这里很重要。

否则,您必须在转换名称之前应用排序。这意味着不对filenoutp1进行排序(因为那时他们的顺序将依赖于listA的顺序。

答案 2 :(得分:1)

您想要的是自然排序。请参阅此主题:Does Python have a built in function for string natural sort?