如何在列表中按升序排列项目 Python

How to arrange items in ascending order in list Python

我的目录中有以下文件:

使用 os.listdir() 我正在读取所有文件,然后将它们保存在列表中。下面是代码:

y = []
files = os.listdir()
for file in files:
    if "mb" in file:
        file = file.split("-")
        loss = file[5]
        lossNum = loss.split('.pth')
        y.append(round(float(lossNum[0]), 3))

print(y)

在上面的代码中,我正在读取文件名,然后将其拆分,以便获得前 8.1996.184 的编号,并将它们保存在列表中。以下是列表的输出:

[8.2, 6.185, 4.115, 4.425, 3.897, 3.972, 5.672, 6.112, 6.129, 5.382, 4.558, 5.476, 4.526, 4.579]

以上列表中的值与文件名不符。例如,索引 0 和 1 处的值是正确的,因为在文件名中 Epoch-0Epoch-1 具有相同的编号,但 Epoch-2 具有编号 5.67 但列表的索引 2 包含 4.11 这是错误的。发生这种情况是因为当我们执行 os.listdit() 时,它会自动列出 Epoch-0、Epoch-1,然后是 Epoch-10、Epoch-11、Epoch-12,而不是 Epoch-2、Epoch-3 等等。我该如何纠正这个问题。请帮忙 谢谢

文件:

["mb1-ssd-Epoch-0-Loss-8.199731510297386.pth",
"mb1-ssd-Epoch-1-Loss-6.184953727553376.pth",
"mb1-ssd-Epoch-10-Loss-4.114924973091193.pth",
"mb1-ssd-Epoch-11-Loss-4.4250144663110245.pth",
"mb1-ssd-Epoch-12-Loss-3.896865705473233.pth",
"mb1-ssd-Epoch-13-Loss-3.972265353245018.pth.filepart",
"mb1-ssd-Epoch-2-Loss-5.671893659946138.pth",
"mb1-ssd-Epoch-3-Loss-6.111974941945709.pth",
"mb1-ssd-Epoch-4-Loss-6.128832694703498.pth",
"mb1-ssd-Epoch-5-Loss-5.382261596949754.pth",
"mb1-ssd-Epoch-6-Loss-4.558234235881704.pth",
"mb1-ssd-Epoch-7-Loss-5.47572956253997.pth",
"mb1-ssd-Epoch-8-Loss-4.526285114541518.pth",
"mb1-ssd-Epoch-9-Loss-4.578502741535153.pth"]

执行此操作以按照您在问题中上传的图片中显示的顺序对文件进行排序:

files = os.listdir()
files.sort(key=lambda x: int(x.split("-")[3]))

您可以拆分数据并将其相应地保存为“Epoch-number”。

一个例子:

string = 'mb1-ssd-Epoch-5-Loss'
Number = string.split(sep='-')[3]

Output: 5

取文件名。应用带有分隔符的拆分函数,最终选择正确的索引。

glob 是仅隔离您真正感兴趣的文件的更好选择。

构建您的文件列表。

根据每个文件名中的第 4 个标记对列表进行排序 - 即 'Epoch' 和 'Loss'

之间的数字

在连字符上拆分文件名,取最后一个标记并忽略最后 4 个字符 (.pth),然后转换为四舍五入的浮点数并添加到您的列表中。

from glob import glob

y = []

for file in sorted(glob('mb*.pth'), key=lambda x: int(x.split('-')[3])):
    n = file.split('-')[-1][:-4]
    y.append(round(float(n), 3))

print(y)

对于问题中显示的文件列表,结果为:

[8.2, 6.185, 5.672, 6.112, 6.129, 5.382, 4.558, 5.476, 4.526, 4.579, 4.115, 4.425, 3.897]