对包含python

时间:2018-04-03 08:51:38

标签: python python-2.7 sorting

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

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]))

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

3 个答案:

答案 0 :(得分: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 :(得分: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']

答案 2 :(得分:1)

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

>>> 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]来排序最后一个数字。