python按字母顺序对带前导数字的字符串进行排序
我有一个文件名列表,每个文件名都以前导号码开头:python按字母顺序对带前导数字的字符串进行排序,python,string,sorting,alphabetical-sort,Python,String,Sorting,Alphabetical Sort,我有一个文件名列表,每个文件名都以前导号码开头: 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”,但没有结果。我必须为此编写自己的算法吗?也许我可以提取前导
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
文件名前的最大数字是多少?取决于。高达120。好的,所有文件名是否都以
\u file
结尾?不,这是不同的字符串和不同的字符。但在每种情况下,前导数字后面都有一个下划线。你能解释一下为什么11_文件
和12_文件
在2_文件
之后按你想要的排序顺序排列吗?只需注意:print(“”
在Python2和Python3中工作<“代码>打印”“仅在Python2I downvoted中有效,因为这会删除任何重复的数字。@JacobIRR这是有效的。似乎是解决问题的正确方法。我必须想办法在我周围的环境中实现(在第一次尝试真实列表时,我得到了错误ValueError:太多的值无法解包(预期为2个)
。但是在您的列表中,它是有效的。您可以通过将num,name=item.split(“”“')
更改为num,name=item.split(“”“)[0]来防止出现值错误
Hmm,我发现关键的一个更容易阅读。部分原因是它太短了。你是如何测量的?对我来说,你的方法比较慢(正如我所期望的那样):…而且由于它的副作用,我不能将较短的版本包括在基准测试中:lst.sort(key=lambda s:s.split(“”“))
@StefanPochmann,我使用了%timeit
和Ajax1234的解决方案。