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

时间:2018-01-10 06:56:08

标签: python sorting

 list=[a1b,a100b,a2b,a99b]

我想通过比较下面的字母a和b的数字进行转换。

 [a1b,a2b,a99b,a100b]

我试过

 list.sort()

但它没有奏效。

我该如何排序?

3 个答案:

答案 0 :(得分:4)

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

>>> 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快一点,因为它在原地运行并且不生成数据副本。

需要注意的另一点是,基于正则表达式排序的此版本比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

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

答案 1 :(得分:2)

您可以使用正则表达式来隔离传递给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']

答案 2 :(得分:2)

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

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