Как отсортировать список строк, которые содержат цифры и символы - PullRequest
2 голосов
/ 07 июня 2019

У меня есть 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.И я не могу использовать int () из-за 'a' и 'b'.

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

Использование кортежа в 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']
0 голосов
/ 07 июня 2019

Использование 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']
0 голосов
/ 07 июня 2019

Использование Regex.

Ex:

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