Форум сайта python.su
Прохожу курс Хирьянова и стопанулся на задаче из второго контеста:
Есть результаты работы студентов в семестре. Студентов выводить в порядке суммы их баллов. Требутеся вывести отсортированные результаты работ для каждого студента.
Данные вводятся как: student_id value
student_id принимает значения от 0 до N. value от 1 до 10
Пример входных данных: 0 3 0 5 1 3 1 2
Тут представленны данные о двух студента: 0 и 1. Сумма балов студента 0 - 8. Студента 1 - 5. Значит, сначала должны быть напечатаны результаты 0 студента, затем 1. Таким образом сначала надо вывести отсортированные результаты студента 0, затем студента 1:
5 3 3 2
Напомним, что у list в питоне есть встроенный метод sort и есть функция sorted. У них есть параметр key, который определяет по каким значениям будет сортироваться объект. Например код ниже будет сортировать лист по длинне его элементов. Так же есть параметр reverse.
a = a.sort(key=lambda x: len(x)) a a.sort(key=lambda x: len(x), reverse=True)
Что такое лямбда функция вы узнаете в дальнейшем (так же всегда есть сайт google). Для выполнения этого задания достаточно понять, на что надо заменить функцию len.
Формат входных данных
В первой строке N - количество студентов. Далее идет какое-то количество строк (не равное N) с результатами студентов в формате: student_id value. 0 <= student_id < N. Значения разделены пробелом. Ввод заканчивается #.
Формат выходных данных
Вывести отсортированные результаты студентов в одну строку. Сначала печатаются результаты лучшего по сумме баллов студента, потом второго и так далее. Результаты в одну строку
Примеры
Ввод Вывод
3
0 3
0 10
2 3
2 2
2 4
#
10 3 4 3 2
Помогите plz
Офлайн
>>> def f(): ... n = int(input()) ... d = {} ... while True: ... s = input() ... if s == '#': ... break ... a, b = map(int, s.split()) ... if a in d: ... d[a][0] += b ... d[a][1].append(b) ... else: ... d[a] = [b, [b]] ... lists = (i[1] for i in sorted(d.values(), reverse=True)) ... out = sum((sorted(i, reverse=True) for i in lists), []) ... print(*out) ... >>> f() 3 0 3 0 10 2 3 2 2 2 4 # 10 3 4 3 2 >>>
Отредактировано py.user.next (Июнь 19, 2022 23:04:43)
Офлайн
>>> data = (0, 3, 0, 5, 1, 3, 1, 2) >>> sorted([ sorted(v for k,v in zip(data[0::2], data[1::2]) if k==x) for x in set(data[0::2]) ], key=su m) [[2, 3], [3, 5]] >>> data = (0, 3, 0, 10, 2, 3, 2, 2, 2, 4) >>> sorted([ sorted(v for k,v in zip(data[0::2], data[1::2]) if k==x) for x in set(data[0::2]) ], key=su m) [[2, 3, 4], [3, 10]]
Офлайн
Для выполнения этого задания достаточно понять, на что надо заменить функцию len.А кто-то может написать решение задачи с учётом условия выше, не применяя практик, о которых новички, вроде меня, ещё понятия не имеют?
Офлайн
На вашем месте опрометчиво ожидать более детального описания.
Потому что:
ncmpsПрименяемые практики это ядро языка, самые его азы. Если вы их не знаете нет смысла вам что-то объяснять. Вы сами ни строчки не напишете без этого.
не применяя практик, о которых новички, вроде меня, ещё понятия не имеют?
ncmpsТам нет словарей. см азы.
Без использования словарей
Офлайн
d = {}т.е. это как бы не объявление пустого словаря, да? Тогда что же? И дальше не идёт добавлений в него ключей и значений. Азы я смотрю по курсу лекций, также, как и автор вопроса. Вот именно там и дают набор инструментов, которым можно решить эти задачи. Разница лишь в том, что студенты могут спросить у преподавателя, а вольным слушателям остаётся надеяться лишь на сообщества онлайн. Только, судя по всему, зря наедятся. У нас почему-то все стремятся показать насколько они круты и что умеют, вместо того, чтобы помочь разобраться в вопросе.
student_count = int(input()) # количество студентов results = input() # все последующие вводы std_input = [] students_lst = [] while results != '#': # добавляем в список все вводы пока не получим '#' на вводе std_input.append(results) results = input() for i in range(student_count): # пробегаемся по индексам студентов tmp_lst = [] # объявляем и обнуляем для каждого нового студента временный подсписок for t in range(len(std_input)): # находим индексы студентов и добавляем все результаты каждого студента в отделный подсписок tmp = std_input[t].split() if int(tmp[0]) == i: tmp_lst.append(int(tmp[1])) if tmp_lst: # если подсписок не пустой, то добавляем его в общий список students_lst.append(tmp_lst) students_lst.sort(key=lambda s: (sum(s), s.sort(reverse=True)), reverse=True) # сортируем список по суммам подсписков и подсписки по убыванию for i in students_lst: # выводим результаты без скобок и запятых for t in i: print(t, end=' ')
for i in students_lst: print(k for k in i)
Отредактировано ncmps (Фев. 29, 2020 23:27:31)
Офлайн
Куда-то все отступы потерялись при копировании на форум, превратилось в одно полотно, что в глазах рябит… Хотя копировал - всё красиво было :\
Офлайн
Я вот не понимаю, чего товарищ Хирьянов добивается своими непонятными тестами, которые не соответствуют условию, но 2 последних теста для этой задачи ожидают вот такого вывода:
Для того, чтобы посмотреть хотя бы чего ждёт тест, я выводил просто первое введённое число, иначе тестирование просто вываливалось с ошибкой EOF.
Отредактировано ncmps (Фев. 29, 2020 19:32:29)
Офлайн
Тоже застрял на этом задании.
На сколько я понял, из начала лекции 6, то задание нужно решить без применения append.
Офлайн
ncmps
Офлайн