python按字母顺序排序带有前导数字的字符串

时间:2018-01-26 20:44:32

标签: python string sorting alphabetical-sort

我有一个文件名列表,每个文件名都以一个前导号码开头:

NSBitsPerPixelFromDepth

我需要按顺序排列:

10_file
11_file
1_file
20_file
21_file
2_file ...

如果它们只是数字作为字符串(' 1')而没有下划线,我可以使用sorted()对它们进行排序。我尝试了不同的排序方法和不同的键属性,还有模块" natsort"但没有结果。我必须为此编写自己的算法吗?也许我可以提取前导数字并将它们用于排序?

更新所需列表以更正列表

4 个答案:

答案 0 :(得分:6)

排序,拆分和列表推导在这里运作良好。

lst = ['10_file', '11_file', '1_file', '20_file', '21_file', '2_file']

lst_split = ['_'.join(x) for x in sorted(i.split('_') for i in lst)]

# ['1_file', '10_file', '11_file', '2_file', '20_file', '21_file'] 

答案 1 :(得分:2)

用OP真正想要的东西编辑:

>>> from functools import partial
>>> lst = ['10_file', '11_file', '1_file', '20_file', '21_file', '2_file']
>>> sorted(lst, key=partial(str.split, sep='_', maxsplit=1))
['1_file', '10_file', '11_file', '2_file', '20_file', '21_file']

答案 2 :(得分:0)

这个怎么样:

flist = ['10_file',
        '11_file',
        '1_file',
        '20_file',
        '21_file',
        '2_file']

tempdict = {}

for item in flist:
    num = item.split('_')[0]
    tempdict[num] = item

output = []

# for truly numeric sorting
#for k in sorted([int(k) for k in tempdict.keys()]):
    #output.append(tempdict[str(k)])

# for alphabetical sorting:
for k in sorted(tempdict.keys()):
    output.append(tempdict[k])

print('\n'.join(output))

<强>结果

1_file
10_file
11_file
2_file
20_file
21_file

答案 3 :(得分:0)

简单的方法。只需提取数字,然后将其排序为字符串:

sorted(l, key=lambda s: s.split("_")[0] )

这就是你所需要的......试试:

l=['2_file', '10_file', '11_file', '1_file', '20_file', '21_file']
print "\n".join(sorted(l, key=lambda s: s.split("_")[0] ))
1_file
10_file
11_file
2_file
20_file
21_file