Вы могли бы написать функция для ключа, возвращающая tuple
с каждой частью интереса, отсортированной по приоритету.
def k(s):
m = {'I':0, 'R':1, 'H':2, 'E':3}
return m[s[3]], int(s[4:] or 0), -ord(s[0])
cols = [
'Aw H',
'Hm I1',
'Aw I2',
'Hm R',
'Aw R',
'Aw I1',
'Aw E',
'Hm I2',
'Hm H',
'Hm E',
]
Результат:
>>> for i in sorted(cols, key=k):
... print(i)
...
Hm I1
Aw I1
Hm I2
Aw I2
Hm R
Aw R
Hm H
Aw H
Hm E
Aw E
tuple
При сортировке с, первые элементы сравниваются в первую очередь. Если они одинаковы, то tuple
s сортируются по их вторым элементам и так далее. Это похоже на то, как обычные слова сортируются в алфавитном порядке.
Поскольку мы сначала хотим все элементы с 'I'
вместе, то 'R'
и так далее, мы положим это первым. Для этого мы определяем словарь, который дает каждой букве свой желаемый приоритет. Когда мы просматриваем эту букву (четвертый символ в строке, s[3]
) в этом словаре, есть первая часть ключа.
Далее, мы хотим номер после этой буквы. Для этого мы будем использовать короткое замыкание для получения либо пятого символа, либо вперед (s[4:]
), либо, если таковых нет, 0
. Мы отправляем его на номер int
, который будет оценивать номер в виде номера, чтобы положить '2'
после '12'
, как и должно быть.
И, наконец, если первые две части одинаковы, элементы будут отсортированы на основе их первого символа. Если бы это был более простой вид, мы могли бы просто указать reverse=True
. Если бы эта часть была числом, мы могли бы просто принять ее отрицательный результат. Мы просто превратим этот персонаж в число с ord()
, а затем возьмем отрицательный результат.
Результатом являются ключи от, например, (0, 2, -65)
для 'Aw I2'
.
Возможный дубликат http://stackoverflow.com/questions/14208256/sort-a-list-with-a-custom-order-in-python или http://stackoverflow.com/questions/3624323/питон-хау к обычаю заказ-а-лист – SIslam