Задание №9 ЕГЭ по информатике: разбор, шаблоны кода Python и анти-примеры | СмартКИМ
СмартКИМ УДОБНАЯ ПОДГОТОВКА К ЕГЭ И ОГЭ
Задачи №9 Решать в тренажере Войти в СмартКИМ
ЕГЭ (1–27) ОГЭ (1–15) Python: шпаргалка
Быстрый переход по номерам и темам
Базовый (1 балл) Время: 3-5 мин Python open() list comprehension count() Все задачи №9 в каталоге

Задание №9. Таблица с числами: считаем подходящие строки

Тема: Обработка строк числовой таблицы: повторы, чётность, суммы и средние
Дан файл, где в каждой строке по несколько чисел. Нужно посчитать, в скольких строках выполнены все условия: про повторы, чётные и нечётные, суммы, средние. Решается циклом по строкам и парой фильтров.

Что от тебя хотят

В таблице несколько тысяч строк, в каждой по 5-6 натуральных чисел. Условие вроде «в строке нет повторов, чётных больше, чем нечётных, и сумма чётных меньше суммы нечётных». Надо сказать, сколько строк подходит под все условия сразу.

В Excel это тянется через вспомогательные столбцы. Python делает то же самое за десять строк, и ошибиться в нём сложнее.

Подготовка: таблицу в текст

Открой файл в Excel и сохрани его как «Текст (с разделителями табуляции)» или CSV, назови 9.txt. Положи рядом с программой. Дальше всё через open.

Идея: одна строка за один проход

  1. Берём строку и превращаем в список чисел: row = [int(x) for x in line.split()].
  2. Делим числа на группы ровно так, как просит условие.
  3. Проверяем условия, и если все выполнены, увеличиваем счётчик.

Условия словами и в коде

УсловиеКод
Все числа различныlen(set(row)) == len(row)
Чётные числа строки[x for x in row if x % 2 == 0]
Повторяющиеся числа (по всем вхождениям)[x for x in row if row.count(x) > 1]
Неповторяющиеся числа[x for x in row if row.count(x) == 1]
Среднее арифметическоеsum(список) / len(список)

row.count(x) считает, сколько раз число стоит в строке. Именно по этому числу строка делится на «повторяющиеся» и «одиночки».

Деление на ноль. Если одна из групп оказалась пустой, sum(...) / len(...) упадёт с ошибкой. Сначала проверь, что в группе есть числа (len(группа) > 0).

Разбор 1: повторяющиеся и одиночки

В каждой строке 6 натуральных чисел. Подсчитайте строки, где выполнены оба условия: в строке есть и повторяющиеся, и неповторяющиеся числа; среднее арифметическое неповторяющихся больше среднего повторяющихся. При вычислении каждое число учитывается столько раз, сколько оно встречается в строке.

В первом окне ниже строка делится на две группы. Условие «есть и те, и другие» превращается в две проверки длины, а «каждое число столько раз, сколько оно встречается» получается само: repeated содержит все вхождения.

Разбор 2: чётность и суммы

В каждой строке 5 натуральных чисел. Подсчитайте строки, где выполнено всё: в строке нет повторяющихся чисел; чётных чисел больше, чем нечётных; сумма чётных меньше суммы нечётных.

Три условия идут через and в одном if. Когда условий много, держи их в одной строке и добавляй по одному: так проще не забыть ни одно.

Не уверен, что условие записано верно? Возьми первые три строки файла, посчитай их руками и сравни с тем, что отвечает программа.

Разновидности и прототипы задания на экзамене

Тип 1: Повторяющиеся и неповторяющиеся числа
Строку делим на числа, которые встречаются больше одного раза, и на числа-одиночки, а потом сравниваем их суммы или средние.
Тип 2: Чётные и нечётные
Сравниваем, сколько чётных и нечётных чисел в строке, или чему равны их суммы.
Тип 3: Все различны
Условие «нет повторяющихся чисел» проверяется одной строкой через set.

Код решения на Python

Запустить код в онлайн-песочнице
Повторяющиеся и неповторяющиеся числа
count = 0
for line in open("9.txt"):
    row = [int(x) for x in line.split()]
    repeated = [x for x in row if row.count(x) > 1]
    single = [x for x in row if row.count(x) == 1]
    if len(repeated) > 0 and len(single) > 0:
        if sum(single) / len(single) > sum(repeated) / len(repeated):
            count += 1

print(count)
Нет повторов, чётных больше, сумма чётных меньше
count = 0
for line in open("9.txt"):
    row = [int(x) for x in line.split()]
    even = [x for x in row if x % 2 == 0]
    odd = [x for x in row if x % 2 == 1]
    if len(set(row)) == len(row) and len(even) > len(odd) and sum(even) < sum(odd):
        count += 1

print(count)

Типичные ошибки

✕ Не так
Делить на длину пустой группы
sum(single) / len(single), когда одиночек в строке нет, даёт ZeroDivisionError.
✓ Так
Сначала проверить len(single) > 0.
✕ Не так
Считать повторяющимися только уникальные значения
Если число стоит в строке дважды, в сумму повторяющихся оно входит два раза.
✓ Так
Брать все вхождения: [x for x in row if row.count(x) > 1].
✕ Не так
Читать заголовок как числа
Первая строка файла с текстом ломает int(x).
✓ Так
Пропустить заголовок: for line in open("9.txt").readlines()[1:].
ГРОБ

ГРОБ №9: Условие про «ровно два» повтора

Бывает так: в строке ровно одна пара одинаковых чисел, а остальные четыре различны. Если проверять только «есть повторы», в счётчик попадут и строки с тройками.

Как обойти
Делай группы по точному количеству вхождений: twice = [x for x in row if row.count(x) == 2] и once = [x for x in row if row.count(x) == 1]. Тогда условие записывается как len(twice) == 2 and len(once) == 4.

Лайфхаки на экзамене

  1. Все числа различны: len(set(row)) == len(row). set выбрасывает повторы, и длина сразу падает.
  2. Если в файле числа разделены точкой с запятой (CSV), пиши line.split(";").
  3. Нужно число, повторяющееся ровно три раза? [x for x in set(row) if row.count(x) == 3] даст его один раз, без дублей.
Банк реальных задач №9 Открыть в тренажере СмартКИМ