首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对包含数字和字符的字符串列表进行排序

如何对包含数字和字符的字符串列表进行排序
EN

Stack Overflow用户
提问于 2019-06-07 16:44:13
回答 3查看 53关注 0票数 2

我有一个应该这样排序的list = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11']

代码语言:javascript
复制
sortedlist = ['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12'].

我该怎么做呢?

我可以通过split方法来分隔字符串,以便只关心-之后的内容。

代码语言:javascript
复制
list.sort(key=lambda a: a.split('-')[1])

但是1-10,1-11等等都在1-8之前。我不能使用int(),因为有'a‘和'b’。

EN

回答 3

Stack Overflow用户

发布于 2019-06-07 16:51:45

使用正则表达式。

Ex:

代码语言:javascript
复制
import re
l = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11']

l.sort(key=lambda a: (int(re.search(r"\-(\d+)[a-z]*", a).group(1)), re.search(r"\-\d+([a-z]*)", a).group(1)))
print(l)

输出:

代码语言:javascript
复制
['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12']
票数 0
EN

Stack Overflow用户

发布于 2019-06-07 16:54:50

使用lambda中的元组作为key参数:

代码语言:javascript
复制
import re

lst = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11'] 

lst.sort(key=lambda a: (int(re.search(r'\d+', a.split('-')[1]).group()), len(a)))

print(lst)
# ['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12']
票数 0
EN

Stack Overflow用户

发布于 2019-06-07 17:07:02

使用re模块:

代码语言:javascript
复制
import re

l = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11']

j = [l[i[0]]
    for i in sorted(
            [(i2, *g)
             for i2, i in enumerate(l)
             for g in re.findall(r'(\d+)-(\d+)(\w?)', i)],
        key=lambda k: (int(k[1]), int(k[2]), k[3]))]

print(j)

打印:

代码语言:javascript
复制
['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56490906

复制
相关文章

相似问题

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