如何对字符串中的模糊数字列表进行排序?

2024-09-29 23:15:22 发布

您现在位置:Python中文网/ 问答频道 /正文

 list=[a1b,a100b,a2b,a99b]

我想通过比较字母a和b之间的数字进行转换,如下所示。你知道吗

 [a1b,a2b,a99b,a100b]

我试过了

 list.sort()

但效果并不好。你知道吗

我怎么分类?你知道吗


Tags: 字母分类数字sortlist效果a2ba1b
3条回答

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

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

选项2
sorted+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快一点,因为它就地操作,不生成数据的副本。你知道吗

另外需要注意的是,这个基于regex的排序版本比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

请注意,实际计时因版本、环境和数据而异。我没有对其他答案进行基准测试,因为它们不能很好地推广到任意结构的输入。你知道吗

可以使用正则表达式来隔离传递给list.sortsorted的键函数的数字:

import re

pat = re.compile(r'a(\d+)b')  # capture group of digits between a and b
lst = ['a1b', 'a100b', 'a2b', 'a99b']
sorted(lst, key=lambda s: int(pat.search(s).group(1)))
# ['a1b', 'a2b', 'a99b', 'a100b']

您可以通过int(s[1:-1])提取中间值作为比较键:

>>> L = ['a1b','a100b','a2b','a99b']
>>> L.sort(key=lambda s: int(s[1:-1]))
>>> L
['a1b', 'a2b', 'a99b', 'a100b']

相关问题 更多 >

    热门问题