根据数字部分的数字顺序对字符串列表进行排序

时间:2021-06-10 09:44:46

标签: python sorting

我有一个可能包含数字的字符串列表。我想按字母顺序对这个列表进行排序,但是每次 String 包含一个数字时,我都希望它按值排序。 例如,如果列表是

['a1a','b1a','a10a','a5b','a2a'], 

排序后的列表应该是

['a1a','a2a','a5b','a10a','b1a']

一般来说,我想把字符串中的每个数字(一个数字序列)当作一个特殊字符,它比任何字母都小,可以在数字上与其他数字进行比较。

是否有任何python函数可以紧凑地执行此操作?

1 个答案:

答案 0 :(得分:1)

您可以使用 re 模块将每个字符串拆分为一个字符元组,并将数字分组为一个元素。类似 r'(\d+)|(.)' 的东西。这个正则表达式的好消息是它将分别返回数字组和非数字组。

作为一个简单的键,我们可以使用:

def key(x):
    # the tuple comparison will ensure that numbers come before letters
    return [(j, int(i)) if i != '' else (j, i)
        for i, j in re.findall(r'(\d+)|(.)', x)]

演示:

lst = ['a1a', 'a2a', 'a5b', 'a10a', 'b1a', 'abc']
print(sorted(lst, key=key)

给出:

['a1a', 'a2a', 'a5b', 'a10a', 'abc', 'b1a']

如果你想要更高效的处理,我们可以在闭包中只编译一次正则表达式

def build_key():
    rx = re.compile(r'(\d+)|(.)')
    def key(x):
        return [(j, int(i)) if i != '' else (j, i)
            for i, j in rx.findall(x)]
    return key

并以这种方式使用它:

sorted(lst, key=build_key())

当然给出相同的输出。

相关问题