Вывести словарь, отсортировав по ключу и значению
Выполняю задание на степике: https://stepik.org/lesson/296967/step/7?unit=278695 (программа на вход принимает строки, в которых указывается имя таксиста, а через запятую его заказ. Ввод прекращается на строке 'конец'. Нужно вывести имя таксиста и его среднюю оценку в порядке убывания, если у кого-то есть еще такая средняя оценка, вывести имена таксистов по алфавиту в порядке убывания)
Вот мой код:
data = {}
while True:
i = input()
if i == 'конец':
break
if i[:i.find(',')] in data:
data[i[:i.find(',')]][0] += int(i[i.find(',') + 2:])
data[i[:i.find(',')]][1] += 1
if i[:i.find(',')] not in data:
data[i[:i.find(',')]] = [int(i[i.find(',') + 2:]), 1]
for key, value in sorted(data.items(), key=lambda name: name[1], reverse=True):
print(key, value[0] / value[1])
На первом тесте у меня все нормально работает, но когда я отправляю свой тестовый словарь в сортировку, например: {"Авраам": 2.5, "Джек": 4.0, "Гермиона": 4.0}, прилетает:
Джек 4.0
Гермиона 4.0
Авраам 2.5
А должно:
Гермиона 4.0
Джек 4.0
Авраам 2.5
Как мне отсортировать все по условию? Пробовал создать новый список и там что-то отсортировать, но это слишком громоздко и некрасиво, уверен, что есть хороший и лаконичный способ это сделать, но я его не знаю в силу не самого большого опыта
Ответы (2 шт):
попробуйте так:
arr = {
'Джек': 4.0,
'Гермиона': 4.0,
'Авраам': 2.5,
}
res = sorted(arr.items(), key=lambda obj: (-obj[1], obj[0]))
print(*res, sep='\n')
Решил проблему просто поставив знак минус перед аргументом:
for key, value in sorted(data.items(), key=lambda x: (-x[1], x[0])):
Решение @Zhihar тоже отличное :)