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的解决方案。