python 按字母顺序对具有前导数字的字符串进行排序
python sort strings with leading numbers alphabetically
我有一个文件名列表,每个文件名都以前导数字开头:
10_file
11_file
1_file
20_file
21_file
2_file ...
我需要按这个顺序排列:
1_file
10_file
11_file
2_file
21_file
22_file ...
如果它们只是字符串形式的数字 ('1') 而没有下划线,我可以使用 sorted() 对它们进行排序。我尝试了具有不同键属性的不同排序方法,也尝试了模块 "natsort",但没有结果。我必须为此编写自己的算法吗?也许我可以提取前导数字并使用它们进行排序?
已更新所需列表以更正列表
这个怎么样:
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
根据 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']
排序、拆分和列表理解在这里工作得很好。
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']
简单的方法。只需提取数字,然后将其排序为字符串:
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
我有一个文件名列表,每个文件名都以前导数字开头:
10_file
11_file
1_file
20_file
21_file
2_file ...
我需要按这个顺序排列:
1_file
10_file
11_file
2_file
21_file
22_file ...
如果它们只是字符串形式的数字 ('1') 而没有下划线,我可以使用 sorted() 对它们进行排序。我尝试了具有不同键属性的不同排序方法,也尝试了模块 "natsort",但没有结果。我必须为此编写自己的算法吗?也许我可以提取前导数字并使用它们进行排序?
已更新所需列表以更正列表
这个怎么样:
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
根据 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']
排序、拆分和列表理解在这里工作得很好。
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']
简单的方法。只需提取数字,然后将其排序为字符串:
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