Метод sort
объекта list
имеет параметр key
, в котором вы можете указать функцию, которая будет определять порядок сортировки. Эта функция должна определить, является ли она MVP или VIP, и найти значение в квадратных скобках.
import re
def main():
lines = [
'b-88698@alt.com : thegiant20** [10]',
'e-b77b2@alt.com : Rancher** [1] [VIP]',
'5-c1eb6@alt.com : dogdad** [4] [VIP]',
'1-15a1f@alt.com : mb1mi** [0]',
'5-cd91b@alt.com : shalexa** [18] [MVP_PLUS]',
]
def sortkey(value):
is_mvp = '[MVP' in value
is_vip = '[VIP' in value
group = re.search(r'\[(\d+)\]', value)
number = int(group[1])
return is_mvp, is_vip, number
lines.sort(key=sortkey, reverse=True)
for line in lines:
print(line)
if __name__ == '__main__':
main()
Сравнение выполняется с кортежем. Первое значение говорит, есть ли у нас MVP. Соответствующее значение - True
или False
(или рассматривается как целое число 1
или 0
). Второе значение то же самое для VIP. Последнее значение - это число из скобок, преобразованное в целое число.
Результат
5-cd91b@alt.com : shalexa** [18] [MVP_PLUS]
5-c1eb6@alt.com : dogdad** [4] [VIP]
e-b77b2@alt.com : Rancher** [1] [VIP]
b-88698@alt.com : thegiant20** [10]
1-15a1f@alt.com : mb1mi** [0]
Добавьте следующую строку в функцию sortkey
перед return
и вы Вы увидите значение и ключ, сгенерированный для него и используемый для сортировки.
print(f'{value} -> key ({int(is_mvp)}, {int(is_vip)}, {number})')
Вывод
b-88698@alt.com : thegiant20** [10] -> key (0, 0, 10)
e-b77b2@alt.com : Rancher** [1] [VIP] -> key (0, 1, 1)
5-c1eb6@alt.com : dogdad** [4] [VIP] -> key (0, 1, 4)
1-15a1f@alt.com : mb1mi** [0] -> key (0, 0, 0)
5-cd91b@alt.com : shalexa** [18] [MVP_PLUS] -> key (1, 0, 18)