对Python中包含路径的列表进行排序

问题描述 投票:0回答:4

如何对包含整数和字符串的路径进行排序? 我的文件名是:

tmp_1483228800-1485907200_0, 
tmp_1483228800-1485907200_1,
tmp_1483228800-1485907200_2,
.... 

我需要根据最后一个下划线后面的整数对它们进行排序。 这就是我的代码的样子:

act = "." + "/*/raw_results.csv"
files = glob.glob(act)
sorted_list = sorted(files, key = lambda x:int(os.path.splitext(os.path.dirname(x))[0]))

我知道问题是有很多整数和中间有一些字符串,所以它不能将所有内容都转换为整数,但我不知道如何解决它。 提前致谢。

python python-2.7 sorting
4个回答
2
投票

根据您的评论,您的文件将采用以下格式:

>>> files = [".../data/tmp_1483228801-1485907200_10/raw_results.csv",
             ".../data/tmp_1483228800-1485907200_1/raw_results.csv",
             ".../data/tmp_1483228801-1485907201_30/raw_results.csv",
             ".../data/tmp_1483228801-1485907200_2/raw_results.csv",
             ".../data/tmp_1483228801-1485907201_9/raw_results.csv"]

然后,您可以提取这些完整的原始文件路径中的所有数字,并将其转换为

int
。无需将路径拆分为目录路径段。

>>> [[int(n) for n in re.findall(r"\d+", f)] for f in files]
[[1483228801, 1485907200, 10],
 [1483228800, 1485907200, 1],
 [1483228801, 1485907201, 30],
 [1483228801, 1485907200, 2],
 [1483228801, 1485907201, 9]]

这将提取路径中的所有数字并按它们排序,为找到的第一个数字赋予最高优先级。如果其他数字都相同,那不是问题,如果不同,它会首先按这些数字排序。

>>> sorted(files, key=lambda f: [int(n) for n in re.findall(r"\d+", f)])
['.../data/tmp_1483228800-1485907200_1/raw_results.csv',
 '.../data/tmp_1483228801-1485907200_2/raw_results.csv',
 '.../data/tmp_1483228801-1485907200_10/raw_results.csv',
 '.../data/tmp_1483228801-1485907201_9/raw_results.csv',
 '.../data/tmp_1483228801-1485907201_30/raw_results.csv']

如果这不是您想要的,您可以使用(有点浪费)

key=lambda f: [int(n) for n in re.findall(r"\d+", f)][-1]
仅按最后一个数字排序。


2
投票

您可以简单地使用

str.rsplit()
作为密钥:

>>> lst = ['tmp_1483228800-1485907200_1', 'tmp_1483228800-1485907200_2','tmp_1483228800-1485907200_0']
>>> sorted(lst, key=lambda x: int(x.rsplit('_', 1)[-1]))
['tmp_1483228800-1485907200_0', 'tmp_1483228800-1485907200_1', 'tmp_1483228800-1485907200_2']

1
投票

代码:

import re, os
PATH = "C:\Temp"
lst = ['tmp_1483228800-1485907200_1', 'tmp_1483228800-1485907200_0', 'tmp_1483228800-1485907200_2']

def stringSplitByNumbers(x):
    l = re.findall('\d$', x)[0]
    return [int(y) if y.isdigit() else y for y in l]

print [ os.path.join(PATH, _) for _ in sorted(lst, key=stringSplitByNumbers)]

输出:

['C:\\Temp\\tmp_1483228800-1485907200_0', 'C:\\Temp\\tmp_1483228800-1485907200_1', 'C:\\Temp\\tmp_1483228800-1485907200_2']

0
投票

有一个名为 sort() 的函数,我想获取文件路径来看看它是如何工作的

© www.soinside.com 2019 - 2024. All rights reserved.