Skip to main content
 首页 » 编程设计

python之如何对字符串中的混淆数字列表进行排序

2025年05月04日19kuangbin

 list=[a1b,a100b,a2b,a99b] 

我想通过比较夹着字母 a 和 b 的数字来转换,如下所示。

 [a1b,a2b,a99b,a100b] 

我试过了

 list.sort() 

但效果不佳。

如何排序?

请您参考如下方法:

选项 1
natsort.natsorted
natsort模块在这里工作得很好 -

>>> from natsort import natsorted 
>>> natsorted(['a1b','a100b','a2b','a99b']) 
['a1b', 'a2b', 'a99b', 'a100b'] 

选项 2
已排序 + re.search
使用 regex,我建议定义一个调用 re.search 的函数来查找和提取数字,并进行一些检查以确保在模式为在字符串中找不到。

import re 
def f(x): 
     m = re.search('\d+', x) 
     return int(m.group()) if m else x 

>>> sorted(['a1b','a100b','a2b','a99b'], key=f) 
['a1b', 'a2b', 'a99b', 'a100b'] 

如果您有一个预先存在的列表并在其上调用 list.sort,您可以获得一些速度增益。 list.sort 执行就地排序并且会比 sorted 快一点,因为它就地操作并且不生成数据副本。

另一件需要注意的事情是,这个版本的基于正则表达式的排序比 lambda 更健壮。捕获和处理异常成为可能,并且您不会受到 lambda 的单行要求的限制。


性能

l = ['a1b','a100b','a2b','a99b'] * 10000 

%timeit natsorted(l) 
1 loop, best of 3: 437 ms per loop 
 
%timeit sorted(l, key=f) 
10 loops, best of 3: 92.4 ms per loop 

请注意,实际时间因版本、环境和数据而异。我没有对其他答案进行基准测试,因为它们不能很好地概括为任意结构化的输入。