Сортировка списка со строковыми и целыми числами - PullRequest
0 голосов
/ 05 августа 2020

Мне не удается найти какие-либо вопросы и ответы на это.

У меня есть список слов, как показано ниже:

['ABC11-2', 'BCD14-1', 'ABC09-1', 'ABC14-1', 'BCD11-2']

Мне нужно отсортировать вот так

['ABC09-1', 'ABC14-1', ABC11-2', 'BCD14-1', 'BCD11-2']

Но с помощью sorted () или sort () я получаю

['ABC09-1','ABC11-2', ABC14-1', 'BCD11-2', 'BCD14-1']

Мне нужно отсортировать по Сначала название единицы, затем семестр, а затем номер единицы.

Спасибо,

Ответы [ 2 ]

4 голосов
/ 05 августа 2020

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

lst = ['ABC11-2', 'BCD14-1', 'ABC09-1', 'ABC14-1', 'BCD11-2']

def f(x):
    x = x.split('-')
    return x[0][:3], int(x[1]), int(x[0][3:])
    
print(sorted(lst, key=f))
# ['ABC09-1', 'ABC14-1', 'ABC11-2', 'BCD14-1', 'BCD11-2']
0 голосов
/ 05 августа 2020

Судя по вопросу, похоже, что название блока состоит из 3 символов в начале, а семестр - из 1 символа в конце. Предполагая, что это так, вы можете переставить символы в названиях курсов и передать это параметру key в sorted(). Это достаточно просто, чтобы вы могли использовать функцию lambda для преобразования.

lst = ['ABC11-2', 'BCD14-1', 'ABC09-1', 'ABC14-1', 'BCD11-2']

print(sorted(lst, key=lambda s: s[:3] + s[-1] + s[3:-1]))

Вывод:

['ABC09-1', 'ABC14-1', 'ABC11-2', 'BCD14-1', 'BCD11-2']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...