Сортировка списка строк целым суффиксом в python

У меня есть список строк:

[song_1, song_3, song_15, song_16, song_4, song_8]

Я хотел бы отсортировать их по # в конце, к сожалению, поскольку нижние числа не являются "08" и "8", в лексикографическом порядке они рассматриваются как более 15.

Я знаю, что мне нужно передать ключ в функцию сортировки, я видел это где-то на этом сайте для сортировки десятичных чисел, которые являются строками:

sorted(the_list, key=lambda a:map(int,a.split('.'))

Но это было для "1.2, 2.5, 2.3", но у меня этого нет. Я думал о замене "." с '_', но из того, что я понимаю, он преобразует обе стороны в ints, что не удастся, так как левая часть _ является строкой.

Любая помощь будет оценена

EDIT: я забыл упомянуть, что все префиксы одинаковы (песня в этом примере)

Ответ 1

Вы близко.

sorted(the_list, key = lambda x: int(x.split("_")[1]))

должен это сделать. Это разделяется на подчеркивание, занимает вторую часть (то есть одно после первого подчеркивания) и преобразует ее в целое число для использования в качестве ключа.

Ответ 2

Ну, вы хотите сначала отсортировать имя файла, затем в int:

def splitter( fn ):
    try:
        name, num = fn.rsplit('_',1)  # split at the rightmost `_`
        return name, int(num)
    except ValueError: # no _ in there
        return fn, None

sorted(the_list, key=splitter)

Ответ 3

sorted(the_list, key = lambda k: int(k.split('_')[1]))

Ответ 4

def number_key(name):
   parts = re.findall('[^0-9]+|[0-9]+', name)
   L = []
   for part in parts:
       try:
          L.append(int(part))
       except ValueError:
          L.append(part)
   return L
sorted(your_list, key=number_key)