首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据数字部分的数字顺序对字符串列表进行排序

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

Stack Overflow用户
提问于 2021-06-10 17:44:47
回答 1查看 50关注 0票数 0

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

代码语言:javascript
复制
['a1a','b1a','a10a','a5b','a2a'], 

排序后的列表应该是

代码语言:javascript
复制
['a1a','a2a','a5b','a10a','b1a']

一般来说,我希望将字符串中的每个数字(一个数字序列)视为一个特殊字符,它比任何字母都小,并且可以在数字上与其他数字进行比较。

有没有什么python函数可以简洁地做到这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-10 18:21:44

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

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

代码语言:javascript
复制
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)]

演示:

代码语言:javascript
复制
lst = ['a1a', 'a2a', 'a5b', 'a10a', 'b1a', 'abc']
print(sorted(lst, key=key)

提供:

代码语言:javascript
复制
['a1a', 'a2a', 'a5b', 'a10a', 'abc', 'b1a']

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

代码语言:javascript
复制
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

并这样使用它:

代码语言:javascript
复制
sorted(lst, key=build_key())

当然也会给出相同的输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67918688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档