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

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

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

Author24 — интернет-сервис помощи студентам
Стояла задача: дан список учеников с фамилиями, именами, классом и баллами.
Нужно найти максимумы оценок по всем классам и вывести количество учеников по каждому классу (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
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 58 секунд
и подскажу как в прошлый раз -достаточно верно поместить в словарь как решение будет на ладони. В консоли попробуй
0
5047 / 3392 / 1156
Регистрация: 21.03.2016
Сообщений: 8,214
20.09.2019, 18:57 10

Не по теме:

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  [ТС] 11
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
ну тогда если только посмотреть если не проходили. а так с множеством и думаю функция max и count вам знакома
И как такому научиться? Хотелось бы понять логику, как до такого додуматься, но пока не понимаю... Всякие там курсы и книжки такого не пишут. Пытаются только дать базу на уровне 2 + 2... Сам хочу такого уровня достичь. Подскажете, что штудировать?
0
Автоматизируй это!
Эксперт Python
7211 / 4707 / 1224
Регистрация: 30.03.2015
Сообщений: 13,413
Записей в блоге: 29
21.09.2019, 08:24 12
Цитата Сообщение от Mik123 Посмотреть сообщение
Подскажете, что штудировать?
все, что найдешь, нет золотой книги или видео, после которой сразу получаешь супер-силу. Чем больше читаешь и практикуешься с кодом, тем выше уровень.
0
5047 / 3392 / 1156
Регистрация: 21.03.2016
Сообщений: 8,214
21.09.2019, 17:05 13
Цитата Сообщение от 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
4977 / 1005 / 144
Регистрация: 29.01.2013
Сообщений: 5,924
22.09.2019, 22:58 14
Mik123, что бы решать подобные задачи, в первую очередь надо учить даже не языки программирования, а алгоритмы. По верному и лаконичному алгоритму вы сможете написать программу на совершенно любом языке, погуглив синтаксис, или воспользовавшись книгой с его описанием.
(Речь идёт об учебных задачах. В промышленной разработке всё немного иначе.)
После того, как алгоритмы перестали вызывать у вас сложности, синтаксис стал привычен и вам не надо каждый раз гуглить методы строк, что бы сделать все символы строчными, следует заняться тем, что называется синтаксическим сахаром. Это такие штуки, которые помогают избежать написания большого количества "лишнего" кода в рамках этого ЯП. В пайтоне это: декораторы, кодогенераторы, лямда-выражения, магические методы классов и объектов и много другое, о чём я не слышал.
2
22.09.2019, 22:58
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2019, 22:58
Помогаю со студенческими работами здесь

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

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

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

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

Бесконечный цикл при подсчете количества строк!
Ситуация довольна странная. При подсчете строк в файле программа сваливается в бесконечный цикл. ...

Отображение нулевых строк в запросе при подсчёте количества
Есть 3 таблицы: Студенты, Ст_хобби и Хобби. В первой хранится группа, ФИО, контактные данные, №...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru