Как сортировать сначала по букве, а потом по номеру?

Некоторое время гуглил, но не могу найти ответ, который я могу приступить к работе.

Я хочу этот список -

sws = ['C6', 'A4', 'B8', 'A8', 'B11', 'C3', 'C5']

быть отсортированным -

sws = ['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']

Я могу приблизиться, но я не могу правильно подобрать B11 и B8, т.е. В моем списке B11 всегда стоит перед B8.

Спасибо


person jms    schedule 01.07.2021    source источник


Ответы (3)


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

def sort_key(text: str):
    letter = text[0]   # the first char
    digits = text[1:]  # everything after the first char
    return (letter, int(digits))

>>> sws = ['C6', 'A4', 'B8', 'A8', 'B11', 'C3', 'C5']
>>> sorted(sws, key=sort_key)
['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']
person damon    schedule 01.07.2021

Вы также можете использовать здесь natsort, который помогает с интуитивно понятной сортировкой:

>>> import natsort
>>> natsort.natsorted(sws)
['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']
person Tom    schedule 01.07.2021

Это можно сделать с помощью одного вкладыша -

sws.sort(key=lambda x: (x[0], int(x[1:])))

print(sws)
# ['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']

Объяснение:
Список кортежей сортируется по первому элементу, затем по второму и т. д.
метод .sort() может сортировать по функции, и в данном конкретном случае функция представляет собой простую лямбда-функцию, которая возвращает два кортежа, состоящие из буквы, а затем числовое значение остальной части строки (которое предполагается числом).
Сочетание этих двух свойств приводит к сортировке на месте, которую вы описали. .

person ShlomiF    schedule 01.07.2021