Помогите с list comprehension python

Как можно "ужать" этот код с помощью List comprehension? Фрагмент который нужно сделать "меньше"

for value in data:
    if number[1] < value[1]:
        right.append(value)
    elif number[1] > value[1]:
        left.append(value)
    else:
        if number[0] == value[0]:
            mid.append(value)
        elif number[2] != value[2]:
            right.append(value) if number[2] > value[2] else left.append(value)
        else:
            right.append(value) if number[0] > value[0] else left.append(value)

Это весь код:

def quick_sort(data):
    mid = []
    right = []
    left = []
    if len(data) < 2:
        return data
    number = data[len(data) % 2]
    for value in data:
        if number[1] < value[1]:
            right.append(value)
        elif number[1] > value[1]:
            left.append(value)
        else:
            if number[0] == value[0]:
                mid.append(value)
            elif number[2] != value[2]:
                right.append(value) if number[2] > value[2] else left.append(value)
            else:
                right.append(value) if number[0] > value[0] else left.append(value)
    return quick_sort(right) + mid + quick_sort(left)

if __name__ == '__main__':
    count = int(input())
    data = [[-int(player[1]), int(player[2]), player[0]] 
             for player in [input().split() for _ in range(count)]]
    sort_data = quick_sort(data)
    print('\n'.join([name[2] for name in sort_data]))

Задание


Ответы (2 шт):

Автор решения: Namerek

Если прямо вот очень быстро "на коленке"

txt = [
    'alla 4 100',
    'gena 6 1000',
    'gosha 2 90',
    'rita 2 90',
    'timofey 4 80'
]

txt2 = [
    'alla 0 0',
    'gena 0 0',
    'gosha 0 0',
    'rita 0 0',
    'timofey 0 0'
]

print(
    *[
        name for name, *_ in [
            item.split() for item in sorted(
                txt,
                key=lambda x: (-int(x.split()[1]), int(x.split()[2]), x.split()[0]),
            )
        ]
    ], sep='\n'
)
print('=' * 50)
print(
    *[
        name for name, *_ in [
            item.split() for item in sorted(
                txt2,
                key=lambda x: (-int(x.split()[1]), int(x.split()[2]), x.split()[0]),
            )
        ]
    ], sep='\n'
)
#gena
#timofey
#alla
#gosha
#rita
#==================================================
#alla
#gena
#gosha
#rita
#timofey

Если не заморачиваться с однострочниками, то получится наглядней да и условие задачи в котором призывают экономить ресурсы ))) будет ближе к выполнению:


def sort_key(key_field: str):
    name, tasks_resolved, mistakes = key_field.split()
    # -int(tasks_resolved) Сортируем по числовому значению количества задач в обратном порядке (по убыванию)
    #   отрицательное значение, нужно для того, чтобы дать возможность сортировать последнее поле (столбец) в алфавитном порядке
    #   если функции `sorted` задать reverse=True (что будет приемлемо для первых двух полей) то сортировка последнего поля не будет соответствовать условию

    # int(mistakes) Сортируем поле количества ошибок по возрастанию в соответствии с условием задачи

    # Поле с именем сортируется по условию задачи в алфавитном порядке

    return -int(tasks_resolved), int(mistakes), name

print(
    *[
        name for name, *_ in [
            item.split() for item in sorted(
                txt,
                key=sort_key,
            )
        ]
    ], sep='\n'
)
→ Ссылка
Автор решения: SergFSM

list comprehension создает новый список, а по условию вашей задачи это делать вроде как нельзя.

Чтобы сортировать "in-place" используйте функцию sort(), в отличии от sorted() она не создает новый список, а сортирует исходный. Например как-то так:

# txt = [input('player >> ') for _ in range(int(input('count >> ')))]
txt = [
    'alla 4 100',
    'gena 6 1000',
    'gosha 2 90',
    'rita 2 90',
    'timofey 4 80'
]

def f(x):
    name, a, b = x.split()
    return -int(a), int(b), name  # ключи для сортировки

txt.sort(key=f)
for n in txt:
    print(n.split()[0])
'''
gena
timofey
alla
gosha
rita
→ Ссылка