Сортировка списка по нескольким ключам
Есть вот таткой список:
players = [
['alla', '4', '100'],
['gena', '6', '1000'],
['gosha', '2', '90'],
['rita', '2', '90'],
['timofey', '4', '80']
]
где 'alla', '4', '100' - это имя, оценка и размер штрафа соответственно.
Его нужно отсортировать, но хитрым способом:
Сначала нужно по сортировать по оценке по возрастанию. То есть, если берем элемент ['gena', '6', '1000'], то обращаемся к '6'. При сортировке получается, что у нас пока что только один элемент подходит - ['gena', '6', '1000']. Из-за символа '6', он самый большой из всех.
Если, попадаются два элемента с одинаковыми оценками, например ['timofey', '4', '80'] и ['alla', '4', '100'], то мы должны их отсортировать по размер штрафа. И этот параметр нужно сортировать по убыванию. Тем меньше размер штрафа - тем лучше. То есть, после элемента ['gena', '6', '1000'] пойдет ['timofey', '4', '80'], т.к. у него размер штрафа == '80', а потом уже будет идти ['alla', '4', '100'], т.к. у него размер штрафа == '100'. То есть уже по убыванию сортировка в этом случае.
А если у элементы списка размер штрафа одинаковы, то сортировать данные нужно по имени. Оно должно идти раньше в алфавитном (лексикографическом) порядке.
В итоге должно получиться вот так:
['gena', '6', '1000'] - на первом месте, так как самая большая из всех оценка, равная 6
['timofey', '4', '80'] - на втором месте, т.к. оценки у них меньше 6 и размер штрафа 80
['alla', '4', '100'] - на третьем месте, т.к. оценки у них меньше 6 и штрафа 100
['gosha', '2', '90'] - на четвертом месте, т.к. оценки и штрафы одинаковы, gosha идет ближе к началу алфавита.
['rita', '2', '90'] - на четвертом месте, т.к. оценки и штрафы одинаковы, rita идет после gosha, ближе к концу алфавита.
Я написал код, но он не сортирует по алфавиту:
def sort_players(players:list, len_array:int):
players.sort(key=lambda arr: (arr[1], arr[2], arr[0]))
while len_array > -1:
print(players[len_array])
len_array -= 1
ответ такой получается:
['gena', '6', '1000']
['timofey', '4', '80']
['alla', '4', '100']
['rita', '2', '90'] - должно быть последним
['gosha', '2', '90'] - должно быть предпоследним.
то есть Гошу и Риту нужно поменять местами. А как?
Ответы (1 шт):
Нужно перевести оценку и штраф в целое и для "убывания" добавить минус:
players = [
['alla', '4', '100'],
['gena', '6', '1000'],
['gosha', '2', '90'],
['rita', '2', '90'],
['timofey', '4', '80']
]
sorted_players = sorted(
players,
key=lambda arr: (
-int(arr[1]),
-int(arr[2]),
arr[0]
)
)
print(*sorted_players, sep='\n')
['gena', '6', '1000']
['alla', '4', '100']
['timofey', '4', '80']
['gosha', '2', '90']
['rita', '2', '90']