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
请注意,实际时间因版本、环境和数据而异。我没有对其他答案进行基准测试,因为它们不能很好地概括为任意结构化的输入。
关于python - 如何对字符串中的混淆数字列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48181862/