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

时间:2019-06-07 08:44:13

标签: python string sorting numbers character

我有list = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11'] 应该以这种方式排序:

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

我该怎么做?

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

list.sort(key=lambda a: a.split('-')[1])

,然后1-10、1-11等在1-8之前。而且由于“ a”和“ b”,我无法使用int()。

3 个答案:

答案 0 :(得分:0)

使用正则表达式。

例如:

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)

输出:

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

答案 1 :(得分:0)

lambda中的元组用作key参数:

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']

答案 2 :(得分:0)

使用re模块:

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)

打印:

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