Найти - Пользователи
Полная версия: Решение задачи по массивам (МФТИ)
Начало » Python для новичков » Решение задачи по массивам (МФТИ)
1 2 3 4
lppp_777
Прохожу курс Хирьянова и стопанулся на задаче из второго контеста:

Есть результаты работы студентов в семестре. Студентов выводить в порядке суммы их баллов. Требутеся вывести отсортированные результаты работ для каждого студента.

Данные вводятся как: 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
py.user.next
  
>>> 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
>>>
Rodegast
 >>> 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]]
ncmps
Для выполнения этого задания достаточно понять, на что надо заменить функцию len.
А кто-то может написать решение задачи с учётом условия выше, не применяя практик, о которых новички, вроде меня, ещё понятия не имеют?
Без использования словарей и прочего, ибо задача подразумевает решение именно такими способами.
И, желательно, хотя бы с минимальным пояснением, что и для чего. Хочется ведь понять, а не тупо скопипастить.
Всем ответившим спасибо
doza_and
На вашем месте опрометчиво ожидать более детального описания.

Потому что:
ncmps
не применяя практик, о которых новички, вроде меня, ещё понятия не имеют?
Применяемые практики это ядро языка, самые его азы. Если вы их не знаете нет смысла вам что-то объяснять. Вы сами ни строчки не напишете без этого.
ncmps
Без использования словарей
Там нет словарей. см азы.

Посмотрите учебники по основным конструкциям, хотя-бы по ключевым словам sorted sum,…
Задавайте вопросы по конкретным местам(строкам) которые вам непонятны.
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=' ')

Постарался объяснить действия в комментариях )

Вопрос: как мне более красиво вывести результаты в print'e?
 for i in students_lst:
    print(k for k in i)
не работает, равно как и print(str(k for k in i))
возвращает ссылку на генератор:
<generator object <genexpr> at 0x03740DB8>

Может ещё что посоветуете упростить )

P.S. Программа проходит тесты до тех пор, пока соблюдаются условия задачи и ввода в тесте. Почему-то в двух последних тестах вводится просто одно число, например 1000 и я не понимаю, какого вывода ожидает тогда этот тест. Получается 2 последних теста из-за этого не проходит.
ncmps
Куда-то все отступы потерялись при копировании на форум, превратилось в одно полотно, что в глазах рябит… Хотя копировал - всё красиво было :\
ncmps
Я вот не понимаю, чего товарищ Хирьянов добивается своими непонятными тестами, которые не соответствуют условию, но 2 последних теста для этой задачи ожидают вот такого вывода:



Для того, чтобы посмотреть хотя бы чего ждёт тест, я выводил просто первое введённое число, иначе тестирование просто вываливалось с ошибкой EOF.
rahmanoff
Тоже застрял на этом задании.
На сколько я понял, из начала лекции 6, то задание нужно решить без применения append.
ElmarB
ncmps

Спасибо что выложил свой вариант, мне очень сильно помогло.
Но есть проблема, когда я ввожу например:
3
0 3
0 8
1 10
1 9
2 7
2 6
#
10 9 7 6 8 3

выводится сначала баллы студента 1 потом студента 2 и в конце студента 0
еше пример:
4
0 3
0 6
1 6
1 8
2 4
2 7
3 7
3 3
#
8 6 7 4 7 3 6 3

выводится сначала студент 1, 2, 3 и в конце 0

По заданию баллы студента 0 должны быть первыми
И я не понимаю как это исправить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB