Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 11

Как упростить решение задачи о подсчете количества

20.09.2019, 15:59. Показов 1291. Ответов 13

Студворк — интернет-сервис помощи студентам
Стояла задача: дан список учеников с фамилиями, именами, классом и баллами.
Нужно найти максимумы оценок по всем классам и вывести количество учеников по каждому классу (9, 10 или 11), которые этот максимум набрали.

пример:
Иванов Сергей 9 80
Сергеев Петр 10 80
Петров Василий 11 81
Васильев Андрей 9 81
Андреев Александр 10 80
Александров Роман 9 81
Романов Иван 11 80


Вывод программы:
2 2 1


Моё решение:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
with open('input.txt', 'r', encoding='utf8') as olimp:
    lines = olimp.readlines()
tmp = []
# сначала забираю в список только класс и баллы
for i in range(len(lines)):
    line = lines[i].strip()
    line = line.split()
    tmp.append([int(line[2]), int(line[3])])
numb = [[9, 0], [10, 0], [11, 0]]
# далее нахожу макс балл по каждому классу
for i in range(len(tmp)):
    if tmp[i][0] == 9 and tmp[i][1] > numb[0][1]:
        numb[0][1] = tmp[i][1]
    elif tmp[i][0] == 10 and tmp[i][1] > numb[1][1]:
        numb[1][1] = tmp[i][1]
    elif tmp[i][0] == 11 and tmp[i][1] > numb[2][1]:
        numb[2][1] = tmp[i][1]
lol = [0] * 3
# теперь вычисляю количество максимальных баллов
for i in range(len(tmp)):
    if tmp[i][0] == 9 and tmp[i][1] == numb[0][1]:
        lol[0] += 1
    elif tmp[i][0] == 10 and tmp[i][1] == numb[1][1]:
        lol[1] += 1
    elif tmp[i][0] == 11 and tmp[i][1] == numb[2][1]:
        lol[2] += 1
print(*lol)
Мне кажется, что это слишком длинный код. Наверняка есть короче без использования модулей / библиотек.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2019, 15:59
Ответы с готовыми решениями:

Как упростить код по поиску экстремумов функции и подсчете количества максимумов на каждом интервале
Добрый день! Составил в матлабе вот такой код по поиску экстремумов функции и подсчете количества максимумов на каждом интервале в 10...

Ошибка в подсчете количества элементов и формировании массива. Как исправить
Создать квадратную матрицу размера MxM, где Mявляется целым числом из диапазона . Конкретный размер матрицы задается пользователем. Матрица...

Подскажите решение или логику задачи с поиском количества друзей
Задача такова: Есть какаято компания, ее директор Петр, он хочет уволить кого то, но незнае кого, и решил уволить того у кого будет...

13
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
20.09.2019, 16:04
Цитата Сообщение от Mik123 Посмотреть сообщение
и вывести количество учеников по каждому классу (9, 10 или 11), которые этот максимум набрали.
Цитата Сообщение от Mik123 Посмотреть сообщение
Вывод программы:
2 2 1
а за 10 класс разве не должно быть 0?
namedtuple или классы можно использовать?
0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
20.09.2019, 16:04
Цитата Сообщение от Mik123 Посмотреть сообщение
Мне кажется, что это слишком длинный код. Наверняка есть короче без использования модулей / библиотек.
Можно запихнуть всё это дело в словарик. Мне кажется так будет намного лучше.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
20.09.2019, 16:04
Damenikx, делай!
0
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 11
20.09.2019, 16:06  [ТС]
В 10 классе 2 ученика набрали 80 балов. Т.е. оба сделали максимум по своему классу. Поэтому ответ 2.
Классы использовать не стоит, так как пока не изучали.
Кортежи, списки, сеты можно.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
20.09.2019, 16:07
Mik123, словари? Винни-панд предложил норм решение
0
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 11
20.09.2019, 16:09  [ТС]
Хотелось бы посмотреть на метод решения со словарем. Пока их не проходили, но некое представление есть
0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
20.09.2019, 16:10
Welemir1, я быстро сделать не смогу. Вот обняв Лутца (в переносном смысле, я имею ввиду книга ). Может быть через минут, где-то час, управлюсь
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
20.09.2019, 16:12
Damenikx, а кто торопит то? тут не конкурс, ты самого себя прокачиваешь. Пока не сделаешь не возвращайся, чтобы чужое решение не подглядеть.

Добавлено через 58 секунд
и подскажу как в прошлый раз -достаточно верно поместить в словарь как решение будет на ладони. В консоли попробуй
0
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
20.09.2019, 18:57

Не по теме:

Damenikx, мы верим в вас! главное начать а форумчане исправят и помогут

Цитата Сообщение от Mik123 Посмотреть сообщение
посмотреть на метод решения со словарем. Пока их не проходили
ну тогда если только посмотреть если не проходили. а так с множеством и думаю функция max и count вам знакома
Python
1
2
3
4
5
6
7
8
9
def filter_num(line):
    return [int(i) for i in line.split()[-2:]]
 
with open('test.txt') as olimp:
    tmp = [filter_num(line) for line in olimp.readlines()]
 
for number in sorted(set(i[0] for i in tmp)):
    list_ball = [i[1] for i in tmp if i[0] == number]
    print( list_ball.count(max(list_ball)) ,end = ' ')
а если еще знаете map то тогда так
Python
1
2
3
4
5
6
with open('test.txt') as olimp:
    tmp =[list(map(int,line.split()[-2:])) for line in olimp.readlines()]
 
for number in sorted(set(i[0] for i in tmp)):
    list_ball = [i[1] for i in tmp if i[0] == number]
    print( list_ball.count(max(list_ball)) ,end = ' ')
1
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 11
21.09.2019, 03:50  [ТС]
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
ну тогда если только посмотреть если не проходили. а так с множеством и думаю функция max и count вам знакома
И как такому научиться? Хотелось бы понять логику, как до такого додуматься, но пока не понимаю... Всякие там курсы и книжки такого не пишут. Пытаются только дать базу на уровне 2 + 2... Сам хочу такого уровня достичь. Подскажете, что штудировать?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
21.09.2019, 08:24
Цитата Сообщение от Mik123 Посмотреть сообщение
Подскажете, что штудировать?
все, что найдешь, нет золотой книги или видео, после которой сразу получаешь супер-силу. Чем больше читаешь и практикуешься с кодом, тем выше уровень.
0
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
21.09.2019, 17:05
Цитата Сообщение от Mik123 Посмотреть сообщение
Подскажете, что штудировать?
для начала знать все основы наизусть(синтаксис, основные методы работы с строками списками и словарями) ну а дальше писать, писать и писать и больше читать. вот для примера возьмем ваш основной код
Python
1
2
3
with open('input.txt', 'r', encoding='utf8') as olimp:
    lines = olimp.readlines()
tmp = []
зачем создавать пустой список если потом его нужно заполнять? сразу генератором создаем список с нужными элементами отсекая из строки имя и фамилию
Python
1
2
with open('test.txt') as olimp:
    tmp = [line.split()[-2:] for line in olimp.readlines()]
нам по условию имя и фамилия не нужны.
это вообще непонятно что и откуда взялось. список классов? тогда зачем второй ноль в каждом списке?
Python
1
numb = [[9, 0], [10, 0], [11, 0]]
а если в входных данных будет 1000 классов? вы так и будете создавать список на 1000 классов? отсюда следует что код надо писать так чтобы под любые данные (согласно структуре входных данных) ваш код работал без внесения изменений. это же и относится к условиям
Python
1
2
3
4
5
6
    if tmp[i][0] == 9 and tmp[i][1] > numb[0][1]:
        numb[0][1] = tmp[i][1]
    elif tmp[i][0] == 10 and tmp[i][1] > numb[1][1]:
        numb[1][1] = tmp[i][1]
    elif tmp[i][0] == 11 and tmp[i][1] > numb[2][1]:
        numb[2][1] = tmp[i][1]
попробуйте в входных данных изменить классы на 3,4,5 и ваш код встанет. также старайтесь не задавать переменную которую используете один раз. подумайте может обойтись без нее. повторяющиеся участки кода выносите в функцию - это сократит ваш код ну и лишних преобразований старайтесь избегать. код что я привел выше тоже страдает лишними преобразованиями. так как номер класса нам нужен только для того что бы сгруппировать балы учеников то его тоже можно не преобразовывать к типу int а вот баллы нужно.
1
5037 / 1064 / 149
Регистрация: 29.01.2013
Сообщений: 6,214
22.09.2019, 22:58
Mik123, что бы решать подобные задачи, в первую очередь надо учить даже не языки программирования, а алгоритмы. По верному и лаконичному алгоритму вы сможете написать программу на совершенно любом языке, погуглив синтаксис, или воспользовавшись книгой с его описанием.
(Речь идёт об учебных задачах. В промышленной разработке всё немного иначе.)
После того, как алгоритмы перестали вызывать у вас сложности, синтаксис стал привычен и вам не надо каждый раз гуглить методы строк, что бы сделать все символы строчными, следует заняться тем, что называется синтаксическим сахаром. Это такие штуки, которые помогают избежать написания большого количества "лишнего" кода в рамках этого ЯП. В пайтоне это: декораторы, кодогенераторы, лямда-выражения, магические методы классов и объектов и много другое, о чём я не слышал.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2019, 22:58
Помогаю со студенческими работами здесь

Ошибка в подсчете количества инверсий
Здравствуйте, помогите разобраться с подсчетом количества инверсий, в случае повторяющихся элементов. Количество элементов в массиве 65537,...

Ошибка в подсчёте количества элементов List
Всем привет. Никак не могу понять, почему система выводит всегда разные значения в MessageBox outputLines = new...

Использование this при подсчете количества символов
Только учусь, потому вопрос из разряда "для новичков". Задача. Необходимо посчитать количество символов уже введенных (изначально...

Ошибка в подсчете количества вхождений символа в строку
Подскажите пожалуйста, в чем ошибка? int _tmain(int argc, _TCHAR* argv) { char sym = 'a'; char str = {"adad aa...

Ошибка при подсчете количества вхождений подстрок
Здравствуйте! Мне нужно найти слова, что начинаются с 'A' и посчитать количество их повторений. Я использую вложенные for'ы.Такой вопрос....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru