Главная › ЕГЭ по информатике › Задание 9
ЕГЭ по информатике · задание №9

Задание 9: решаем таблицы кодом на Python

Сохраняем таблицу в CSV, читаем строки и проверяем условия по шпаргалке. Разбираем повторы, суммы и пары, затем пишем свои программы и проверяем их на учебных файлах.

План решения по шпаргалке

Задание 9 ЕГЭ: читаем строку, проверяем условия, выбираем ответ

Таблицу сохраняем в CSV, затем Python читает её сверху вниз. Каждая строка превращается в отдельный список чисел a. Для него проверяем повторы, суммы и сравнения. Циклы и типы данных заново изучать не будем: разберём именно строки, которые нужны для этих задач.

таблица→ сохранить вCSV→ строка s →список a→ проверки → ответ

Сначала выдели в вопросе, что требуется найти

ВопросЧто выводимКак завершаем поиск
Сумма чисел в строке с наименьшим номеромprint(sum(a))Первое совпадение сверху вниз; после печати break.
Наименьший номер подходящей строкиprint(number)Нумеруем каждую строку; после первого совпадения break.
Количество всех подходящих строкprint(count) после циклаВнутри проверок count += 1, просматриваем весь файл.
Первая подходящая строка — не строка с наименьшей суммойВ первом типе выбираем строку по её месту в файле, а из выбранной строки берём сумму. Другая подходящая строка ниже может иметь меньшую сумму — она уже не является ответом.
Подготовка файла обязательна

Как сохранить таблицу в CSV для Python

Код open(...) и split(';') из шпаргалки читает текстовые строки. Если исходный файл имеет расширение .xlsx или .ods, сначала сохрани нужный лист в CSV. Простая замена расширения в имени не преобразует содержимое.

В Excel

  1. Открой исходную таблицу и выбери лист с числами задачи.
  2. Нажми Файл → Сохранить как и укажи папку с решением.
  3. В типе файла выбери CSV; если есть вариант CSV UTF-8, выбери его. Назови файл, например, type1.csv.
  4. Подтверди сохранение в CSV, если появится предупреждение о возможностях формата. Сохраняется активный лист, поэтому сначала проверь, какой лист открыт.

Фактический разделитель может зависеть от настроек: не считай, что в любом CSV обязательно стоит точка с запятой. Открой сохранённый файл в текстовом редакторе и посмотри первую строку.

В LibreOffice Calc

  1. На нужном листе выбери Файл → Сохранить как.
  2. В типе файла укажи Текст CSV (.csv). Включи изменение параметров фильтра.
  3. В параметрах экспорта выбери кодировку UTF-8 и разделитель полей ;. Для числовых данных не нужен режим фиксированной ширины.
  4. Подтверди сохранение в выбранном формате и проверь результат текстовым редактором.

Что должно оказаться в CSV

12;45;7;18;90
7;7;10;20;30

Одна исходная строка таблицы соответствует одной строке файла, а числа отделены ;. Имена столбцов A, B, C и номера строк слева — элементы интерфейса таблицы: вручную вписывать их в CSV не нужно. В этих трёх типах первая строка данных имеет номер 1; дополнительный заголовок сдвинет нумерацию.

Сохрани порядок исходных строкНе сортируй таблицу перед поиском первой строки и не удаляй неподходящие строки. Иначе исходные номера потеряются. Для каждого задания используй его собственный файл и проверь число столбцов: здесь это 5, 7 или 4.

Справка по сохранению: Microsoft Excel, LibreOffice Calc и параметры экспорта Calc.

Первая строка программы

Из строки CSV в список чисел

Сначала проверь только чтение файла
f = open('type1.csv', encoding='utf-8-sig')
for s in f:
    a = list(map(int, s.split(';')))
    print(a)
f.close()
ШагДля строки 12;45;7;18;90
sТекст одной строки CSV. В конце обычно есть перевод строки.
s.split(';')['12', '45', '7', '18', '90'] — части ещё текстовые; последний элемент может содержать перевод строки.
map(int, ...)Каждая часть превращается в целое число; int допускает пробелы и перевод строки по краям.
list(...)Получаем [12, 45, 7, 18, 90]. Теперь доступны a[0], min(a), max(a), sum(a), a.count(x).

encoding='utf-8-sig' читает UTF-8 и убирает служебную метку BOM в начале, если она есть. Сохраняй CSV в UTF-8, как выше. Имя в open должно совпадать с сохранённым файлом.

Для относительного имени type1.csv Python ищет файл в текущей рабочей папке запуска. Открой распакованную учебную папку как рабочую папку редактора или перейди в неё в терминале, затем запускай программу. Проверка ниже покажет текущую папку и видимые CSV:

from pathlib import Path
print(Path.cwd())
print(list(Path.cwd().glob('*.csv')))
Если в CSV запятые или числа в кавычках

Для строки 12,45,7,18,90 нужен split(','). Если экспорт заключил значения в кавычки, например "12";"45", обычный split оставит кавычки и int не сможет прочитать число. Можно использовать стандартный csv.reader:

Чтение CSV с учётом кавычек
import csv

with open('type1.csv', encoding='utf-8-sig', newline='') as f:
    for row in csv.reader(f, delimiter=';'):
        a = list(map(int, row))
        print(a)

Здесь reader уже разбивает строку на поля, поэтому второй split не требуется. Если разделитель запятая, поменяй delimiter=';' на delimiter=','. Затем вместо диагностического print(a) вставь проверки нужного типа.

Подробности: csv.reader в документации Python и кодировка utf-8-sig.

Проверь, что именно читает split

Тренажёр разделителя CSV

Вставь одну строку с пятью натуральными числами и выбери тот же разделитель, что указан в split. Тренажёр работает с простыми числовыми полями без кавычек, как короткий код из шпаргалки.

Тип 1 · пять чисел

Все числа разные: сумма первой подходящей строки

В каждой строке пять натуральных чисел. Все числа выбранной строки различны. Удвоенная сумма минимального и максимального больше утроенной суммы трёх остальных. Найди сумму чисел в подходящей строке с наименьшим номером.

1. Проверяем повторы по шпаргалке

Для каждой позиции считаем, сколько раз её значение встречается во всей строке. Если все пять значений разные, получаем частоты 1, 1, 1, 1, 1. Их сумма равна 5.

aЧастоты для пяти позицийСумма частотВсе разные?
7, 7, 10, 20, 302, 2, 1, 1, 17Нет
1, 2, 3, 4, 1001, 1, 1, 1, 15Да

При повторе значение с частотой k добавляет k в каждой из k позиций, то есть k² вместо k. Поэтому любая повторяющаяся группа делает сумму частот больше числа элементов. Сравнение с 5 работает именно для строки из пяти чисел.

2. Переносим сравнение сумм

ФразаВыражение
Минимум плюс максимумmin(a) + max(a)
Удвоенная сумма крайних(min(a) + max(a)) * 2
Сумма остальных трёхsum(a) - max(a) - min(a)
Она взята втрое(sum(a) - max(a) - min(a)) * 3
Первая величина больше второйМежду выражениями ставим >, не >=.

3. Печатаем сумму и останавливаемся

Полная программа · файл type1.csv
f = open('type1.csv', encoding='utf-8-sig')
for s in f:
    a = list(map(int, s.split(';')))
    a1 = a.count(a[0])
    a2 = a.count(a[1])
    a3 = a.count(a[2])
    a4 = a.count(a[3])
    a5 = a.count(a[4])
    if a1 + a2 + a3 + a4 + a5 == 5:
        if (min(a) + max(a)) * 2 > (sum(a) - max(a) - min(a)) * 3:
            print(sum(a))
            break
f.close()

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

Проверь на маленьком файле из учебного архива

СтрокаЧисло 1Число 2Число 3Число 4Число 5
177102030
21020304050
31234100
4234580
5145630

В строке 1 есть повтор. В строке 2: 2 × (10 + 50) = 120, а 3 × (20 + 30 + 40) = 270 — сравнение ложно. Строка 3 проходит: 2 × (1 + 100) = 202 > 3 × (2 + 3 + 4) = 27.

Для учебного type1.csv ответ: 110Это сумма строки 3. Строки ниже тоже могут подходить и иметь меньшую сумму — выбирать минимум суммы не нужно.

В шпаргалке для исходной таблицы указан ответ 480. Здесь отдельный маленький учебный CSV с ответом 110: ответ зависит от содержимого файла.

Тип 2 · семь чисел

Две пары повторов: наименьший номер строки

В каждой строке семь натуральных чисел. Два разных значения встречаются по два раза, остальные три — по одному. Среднее арифметическое всех повторяющихся элементов меньше максимального неповторяющегося. Найди наименьший номер подходящей строки.

1. Почему в шпаргалке сумма частот равна 11

Для строки 2;2;6;6;1;5;9 частоты по позициям — 2, 2, 2, 2, 1, 1, 1. Четыре позиции с частотой 2 дают 8, три одиночных — ещё 3: итого 11.

Для семи элементов это выделяет именно две пары и три одиночных. Каждая пара повышает сумму частот на 2 относительно семи единиц, а уже тройной повтор повышает её на 6. Здесь требуется увеличение на 4 — значит, это две пары.

2. Собираем повторяющиеся и неповторяющиеся элементы

povt = []
nepovt = []
for x in a:
    if a.count(x) == 1:
        nepovt.append(x)
    else:
        povt.append(x)

Это те же действия append из шпаргалки, выполненные одним циклом для всех семи позиций. Для выбранной строки получится povt = [2, 2, 6, 6] и nepovt = [1, 5, 9]. Повторяющиеся значения сохраняют обе копии: считаем все четыре элемента, а не множество разных значений.

3. Проверяем среднее и максимум

Что считаемЗначение для 2;2;6;6;1;5;9
sum(povt) / 4(2 + 2 + 6 + 6) / 4 = 4
max(nepovt)max(1, 5, 9) = 9
sum(povt) / 4 < max(nepovt)4 < 9 — истина

Сначала проверяем состав повторов, затем считаем среднее. Только после первой проверки известно, что в povt четыре элемента, а неповторяющиеся числа вообще есть. Вариант без деления: sum(povt) < 4 * max(nepovt).

4. Нумеруем каждую строку, включая неподходящие

Развёрнутый способ по шпаргалке
f = open('type2.csv', encoding='utf-8-sig')
number = 0
for s in f:
    number += 1
    a = list(map(int, s.split(';')))
    a1 = a.count(a[0])
    a2 = a.count(a[1])
    a3 = a.count(a[2])
    a4 = a.count(a[3])
    a5 = a.count(a[4])
    a6 = a.count(a[5])
    a7 = a.count(a[6])
    if a1 + a2 + a3 + a4 + a5 + a6 + a7 == 11:
        povt = []
        nepovt = []
        for x in a:
            if a.count(x) == 1:
                nepovt.append(x)
            else:
                povt.append(x)
        if sum(povt) / 4 < max(nepovt):
            print(number)
            break
f.close()

number += 1 выполняется сразу после получения новой строки, до if. Если увеличить number только внутри отбора, получится порядковый номер среди совпадений, а не исходный номер таблицы. Чтение начинается с первой строки данных, number меняется с 0 на 1.

Короткий способ из шпаргалки

Те же условия через списковые включения
f = open('type2.csv', encoding='utf-8-sig')
number = 0
for s in f:
    number += 1
    a = list(map(int, s.split(';')))
    povt = [x for x in a if a.count(x) == 2]
    nepovt = [x for x in a if a.count(x) == 1]
    if len(povt) == 4 and len(nepovt) == 3:
        if sum(povt) / 4 < max(nepovt):
            print(number)
            break
f.close()

a.count(x) == 2 оставляет каждую позицию, чьё значение встречается дважды. Поэтому len(povt) == 4, а не 2. len(nepovt) == 3 завершает проверку состава строки. povt == 4 сравнивает список с числом и не проверяет его длину.

Учебный type2.csv

СтрокаЧисло 1Число 2Число 3Число 4Число 5Число 6Число 7
11234567
22244133
320203030123
42266159
51133245
62224569
76666139

Строка 1 без двух пар; строка 2 содержит три пары; строка 3 имеет нужные повторы, но среднее 25 не меньше максимального одиночного 3. В строке 4 среднее повторяющихся равно 4, максимум одиночных — 9.

Для учебного type2.csv ответ: 4Выводим номер строки, а не её сумму и не количество совпадений. Оба способа дают одинаковый результат.

В шпаргалке для исходного файла указан первый подходящий номер 17. В маленьком учебном файле ответ 4.

Тип 3 · четыре числа

Количество строк: максимум и три разбиения на пары

В каждой строке четыре натуральных числа. Наибольшее меньше суммы трёх других. Числа нельзя разбить на две пары с одинаковой суммой. Определи количество подходящих строк.

1. Убираем из суммы один максимальный элемент

Сумма трёх других чисел — sum(a) - max(a). Даже если максимум повторяется, вычитаем одно его вхождение: нужно убрать один выбранный элемент, а не все максимумы.

2. Проверяем все три разбиения

Разбиение по индексамДолжно выполняться
(0, 1) и (2, 3)a[0] + a[1] != a[2] + a[3]
(0, 2) и (1, 3)a[0] + a[2] != a[1] + a[3]
(0, 3) и (1, 2)a[0] + a[3] != a[1] + a[2]

Почему вариантов только три? Для элемента с индексом 0 есть ровно три возможных напарника. После его выбора два оставшихся элемента образуют вторую пару. Все четыре позиции используются ровно один раз.

«Нельзя разбить» означает, что каждое разбиение должно дать разные суммы. Соединяем три != через and. Если хотя бы в одном разбиении суммы равны, строка не подходит. Через or мы разрешили бы равенство в другом разбиении.

3. Считаем весь файл

Полная программа · файл type3.csv
f = open('type3.csv', encoding='utf-8-sig')
count = 0
for s in f:
    a = list(map(int, s.split(';')))
    if max(a) < sum(a) - max(a):
        if (a[0] + a[1] != a[2] + a[3]
                and a[0] + a[2] != a[1] + a[3]
                and a[0] + a[3] != a[1] + a[2]):
            count += 1
print(count)
f.close()

count += 1 стоит внутри обеих проверок, а print(count) — после внешнего цикла. Здесь нет break: нужно количество всех строк. Условия о разных числах в этом типе нет, поэтому повторы сами по себе разрешены.

Учебный type3.csv

СтрокаЧисло 1Число 2Число 3Число 4
112310
21234
32346
41357
53334
61113
72244
82458

Строка 1 не проходит проверку максимума: 10 < 6 ложно. Строка 2 даёт равные пары 1 + 4 = 2 + 3. Строка 3 подходит: 6 < 9 и ни одно из трёх разбиений не даёт равенства. Строка 5 с повторяющимися тройками тоже подходит.

Для учебного type3.csv ответ: 3Проходят строки 3, 5 и 8. В строке 6 максимум 3 равен сумме остальных 3: строгое сравнение её не пропускает.

Для исходного файла в шпаргалке указан ответ 2354. Учебный CSV содержит только восемь строк и даёт ответ 3.

Отладка одного кандидата

Разбери строку по условиям выбранного типа

Выбери тип и введи одну строку натуральных чисел через точку с запятой. Тренажёр покажет частоты, состав списков, сравнения или все три разбиения на пары.

Тренажёр проверяет одну строку. Её номер и то, была ли она первой подходящей, можно узнать только при просмотре файла сверху вниз.

Твоя очередь написать решение

Три программы с пропусками и практика с файлами

Скачай учебный архив и распакуй его. В корне находятся practice1.csv, practice2.csv и practice3.csv. В этих задачах условия знакомые, а данные новые. Собери код, запусти его из папки с CSV и введи полученный результат.

«Проверить строки» сверяет выражения с шаблоном. Страница не запускает введённый Python. Для другого способа решения используй запуск в своём редакторе и проверку числового ответа. После правки можно проверять повторно.

Решено: 0 из 12

Сборка 1. Сумма первой подходящей строки

В practice1.csv по пять натуральных чисел в строке. Все числа выбранной строки различны. Удвоенная сумма минимума и максимума больше утроенной суммы трёх остальных. Найди сумму чисел первой подходящей строки.
Показать содержимое practice1.csv
СтрокаЧисло 1Число 2Число 3Число 4Число 5
1447860
21020304050
32567100
4134580
f = open('practice1.csv', encoding='utf-8-sig')
for s in f:
    a = ⟦1⟧
    frequencies = [a.count(x) for x in a]
    if sum(frequencies) == ⟦2⟧:
        if (min(a) + max(a)) * ⟦3⟧ > (⟦4⟧) * 3:
            print(⟦5⟧)
            ⟦6⟧
f.close()

1. Какой ответ напечатала программа?

Введи одно итоговое число после запуска своего кода.

Сборка 2. Наименьший номер строки с двумя парами

В practice2.csv по семь натуральных чисел. Ровно два разных значения встречаются по два раза, остальные три — по одному. Среднее всех четырёх повторяющихся элементов меньше максимального неповторяющегося. Найди наименьший номер строки.
Показать содержимое practice2.csv
СтрокаЧисло 1Число 2Число 3Число 4Число 5Число 6Число 7
11234567
210102020123
32244669
4661010138
544881710
61122345
f = open('practice2.csv', encoding='utf-8-sig')
number = 0
for s in f:
    number = ⟦1⟧
    a = list(map(int, s.split(';')))
    povt = [x for x in a if ⟦2⟧]
    nepovt = [x for x in a if ⟦3⟧]
    if len(povt) == 4 and len(nepovt) == 3:
        if ⟦4⟧ < ⟦5⟧:
            print(⟦6⟧)
            break
f.close()

2. Какой ответ напечатала программа?

Введи одно итоговое число после запуска своего кода.

Сборка 3. Количество строк без разбиения на равные пары

В practice3.csv по четыре натуральных числа. Максимум меньше суммы трёх остальных, и числа нельзя разбить на две пары с равными суммами. Посчитай подходящие строки.
Показать содержимое practice3.csv
СтрокаЧисло 1Число 2Число 3Число 4
12346
22356
34445
42226
51468
65556
71248
81223
f = open('practice3.csv', encoding='utf-8-sig')
count = 0
for s in f:
    a = list(map(int, s.split(';')))
    if ⟦1⟧ < ⟦2⟧:
        if (a[0] + a[1] ⟦3⟧ a[2] + a[3]
                ⟦6⟧ a[0] + a[2] ⟦3⟧ a[1] + a[3]
                ⟦6⟧ a[0] + a[3] ⟦3⟧ a[1] + a[2]):
            count = ⟦4⟧
print(⟦5⟧)
f.close()

3. Какой ответ напечатала программа?

Введи одно итоговое число после запуска своего кода.

Проверь понимание без большого файла

4. Разделитель файла

Файл содержит 12,45,7,18,90. Какой символ нужно указать в split? Напиши название: «запятая» или «точка с запятой».

5. Пять разных чисел

Для a = [7, 7, 10, 20, 30] чему равна сумма пяти выражений a.count(a[i])?

6. Сумма остальных

a = [1, 2, 3, 4, 100]. Чему равно sum(a) - max(a) - min(a)?

7. Количество повторяющихся элементов

Для a = [2, 2, 6, 6, 1, 5, 9] сколько элементов в povt = [x for x in a if a.count(x) == 2]?

8. Среднее повторяющихся

Для povt = [2, 2, 6, 6] чему равно sum(povt) / 4?

9. Сохраняем исходный номер

Две первые строки не прошли отбор, третья прошла. Какой номер нужно вывести в задаче о наименьшем номере строки?

10. Количество разбиений

Сколькими способами можно разбить четыре позиции на две неупорядоченные пары?

11. Нельзя разбить на равные пары

a = [1, 2, 3, 4]. Проходит ли строка запрет равных сумм пар? Ответь «да» или «нет».

12. Точная граница сравнения

В третьем типе a = [1, 1, 1, 3]. Подходит ли строка? Ответь «да» или «нет».

От шаблона к чистому файлу

Скачать CSV и программы для самостоятельной работы

Внутри четыре готовые программы, три CSV к разборам и ещё три CSV для практики. В папке practice — условия с местом для твоего кода, в solutions — решения для сверки после попытки.

Скачать Python + учебные CSVРаспакуй архив целиком и запускай из его корневой папки. Все программы используют стандартный Python 3. Из папки practice запускай так: python practice/05_task.py — оставаясь в корне архива, где лежат CSV.

Не меняй порядок строк. Сначала проверь чтение через print(a), затем перенеси каждое ограничение в код и только после этого запускай весь файл. Контроль учебных примеров: 110, 4, 3. Новая практика: 120, 5, 4.

Видеоразбор

Видео по заданию №9

Видео скоро выйдет.

Если код не работает или ответ отличается

Ошибка или симптомПричина и действие
FileNotFoundErrorИмя или рабочая папка не совпали. Проверь Path.cwd(), имя CSV и расширение; файл может оказаться type1.csv.csv.
Ошибка декодирования или странные символыСохрани CSV заново в UTF-8 и читай с encoding='utf-8-sig'.
int не может прочитать всю строку с запятымиВ файле другой разделитель. Открой его текстовым редактором и исправь split.
int видит кавычки, заголовок или пустое полеПроверь экспорт. Для кавычек используй csv.reader. Заголовки и пустые клетки не являются натуральными числами.
IndexError при a[6]Программа ожидает семь чисел, но прочитано меньше. Проверь разделитель и файл именно этого типа.
Номер строки оказался равен 1 вместо исходного номераNumber увеличивается только после отбора. Перенеси увеличение перед if.
Выводятся все суммы или номераПосле первого найденного ответа в типах 1 и 2 нужен break.
Пустой вывод в типе 1 или 2Не найдено совпадение. Проверь отдельную строку и файл; print здесь выполняется только при выполнении условий.
Среднее повторяющихся получается невернымВ этой задаче считаем четыре элемента с копиями. Не заменяй povt множеством и не дели его сумму на 2.
Появляется max() arg is an empty sequenceMax(nepovt) вызван раньше проверки состава повторов. Сначала убедись в наличии трёх одиночных.
Строка с равными парами почему-то проходитДля запрета всех трёх равенств нужны != и and.
Количество равно 1, хотя подходящих строк большеУбери break из типа 3; итоговый print(count) находится после цикла.

Отлаживай один шаг: временно выведи a, затем частоты, затем povt и nepovt или суммы пар. Сравни их с ручным разбором той же строки. Проверки и списки должны создаваться заново внутри цикла для каждой строки.

Вопросы о решении задания 9 кодом

Нужно ли переименовать .xlsx в .csv?

Нет. Нужно открыть таблицу и выполнить «Сохранить как» с выбором формата CSV. Только тогда бинарная книга превратится в текстовые строки, которые читает короткая программа.

Всегда ли у CSV разделитель — точка с запятой?

Нет. Он зависит от экспорта. Проверь файл текстовым редактором и используй такой же символ в split или csv.reader.

Можно ли пропускать все строки, где случилась ошибка чтения?

В задаче о номере строки это может скрыть неправильный экспорт и исказить соответствие исходной таблице. Найди причину ошибки и исправь чтение. В учебных файлах нет заголовков, пустых строк и пропусков данных.

Зачем в трёх примерах разные имена файлов?

В них разное число столбцов: пять, семь и четыре. В учебном архиве каждый пример имеет собственный CSV, чтобы было понятно, с какими данными запускать программу. Для нового задания подставь его настоящее имя и заново перенеси условия.

Почему ответы из шпаргалки и учебного архива разные?

Шпаргалка указывает 480, 17 и 2354 для своих исходных таблиц. Здесь приведены маленькие учебные файлы с полностью видимыми строками: на них легко проверить каждую операцию вручную. Проверять ответ нужно вместе с тем файлом, для которого он получен.

Где повторить отдельную команду Python?

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

Закрепи решение с чистого листа

Открой условие из папки practice, выбери нужный CSV и напиши весь код самостоятельно. До запуска назови, что является ответом: сумма, номер или количество. После проверки переходи к тренировке на новых файлах.