Python列表排序创建不同的顺序

2024-10-02 04:33:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本来移动项目,并对其执行一些基本功能。它依赖于列表.排序()以确保文件放在正确的位置。你知道吗

例如,我有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函数排序直到第一个下划线?你知道吗


Tags: 文件patha2排序a1etcsortext
3条回答

你想要的是自然排序。看看这个帖子:Does Python have a built in function for string natural sort?

在python中对字符串进行排序是一种词典排序。字符串按字典顺序进行比较。所以'A10''A11'排在'A1_'之前。你知道吗

您可以通过以下方式获得预期行为:

lst.sort(key=lambda x: int(x.split('_')[0][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的两个元素无论如何都会变得相同,所以这在这里并不重要。你知道吗

否则,必须在转换名称之前应用排序。这意味着不排序filenoutp1(因为这样它们的顺序将依赖于listA的顺序)。你知道吗

相关问题 更多 >

    热门问题