Python порядок вывода - PullRequest
0 голосов
/ 08 мая 2020
• 1000 быть размещенным выше в .txt как VIP, а 80 будет выше, чем 20, это пример .txt
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]

, но я хочу, чтобы он был заказан, чтобы он выглядел так

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]

Могу ли я что-нибудь добавить, что могло бы легко достичь этого или нет?

1 Ответ

0 голосов
/ 08 мая 2020

Метод 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)
...