Задание 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
- Открой исходную таблицу и выбери лист с числами задачи.
- Нажми Файл → Сохранить как и укажи папку с решением.
- В типе файла выбери CSV; если есть вариант CSV UTF-8, выбери его. Назови файл, например,
type1.csv. - Подтверди сохранение в CSV, если появится предупреждение о возможностях формата. Сохраняется активный лист, поэтому сначала проверь, какой лист открыт.
Фактический разделитель может зависеть от настроек: не считай, что в любом CSV обязательно стоит точка с запятой. Открой сохранённый файл в текстовом редакторе и посмотри первую строку.
В LibreOffice Calc
- На нужном листе выбери Файл → Сохранить как.
- В типе файла укажи Текст CSV (.csv). Включи изменение параметров фильтра.
- В параметрах экспорта выбери кодировку UTF-8 и разделитель полей ;. Для числовых данных не нужен режим фиксированной ширины.
- Подтверди сохранение в выбранном формате и проверь результат текстовым редактором.
Что должно оказаться в CSV
12;45;7;18;90
7;7;10;20;30Одна исходная строка таблицы соответствует одной строке файла, а числа отделены ;. Имена столбцов A, B, C и номера строк слева — элементы интерфейса таблицы: вручную вписывать их в CSV не нужно. В этих трёх типах первая строка данных имеет номер 1; дополнительный заголовок сдвинет нумерацию.
Справка по сохранению: 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:
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.
Тренажёр разделителя CSV
Вставь одну строку с пятью натуральными числами и выбери тот же разделитель, что указан в split. Тренажёр работает с простыми числовыми полями без кавычек, как короткий код из шпаргалки.
Все числа разные: сумма первой подходящей строки
1. Проверяем повторы по шпаргалке
Для каждой позиции считаем, сколько раз её значение встречается во всей строке. Если все пять значений разные, получаем частоты 1, 1, 1, 1, 1. Их сумма равна 5.
| a | Частоты для пяти позиций | Сумма частот | Все разные? |
|---|---|---|---|
| 7, 7, 10, 20, 30 | 2, 2, 1, 1, 1 | 7 | Нет |
| 1, 2, 3, 4, 100 | 1, 1, 1, 1, 1 | 5 | Да |
При повторе значение с частотой 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. Печатаем сумму и останавливаемся
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 |
|---|---|---|---|---|---|
| 1 | 7 | 7 | 10 | 20 | 30 |
| 2 | 10 | 20 | 30 | 40 | 50 |
| 3 | 1 | 2 | 3 | 4 | 100 |
| 4 | 2 | 3 | 4 | 5 | 80 |
| 5 | 1 | 4 | 5 | 6 | 30 |
В строке 1 есть повтор. В строке 2: 2 × (10 + 50) = 120, а 3 × (20 + 30 + 40) = 270 — сравнение ложно. Строка 3 проходит: 2 × (1 + 100) = 202 > 3 × (2 + 3 + 4) = 27.
В шпаргалке для исходной таблицы указан ответ 480. Здесь отдельный маленький учебный CSV с ответом 110: ответ зависит от содержимого файла.
Две пары повторов: наименьший номер строки
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 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 2 | 2 | 2 | 4 | 4 | 1 | 3 | 3 |
| 3 | 20 | 20 | 30 | 30 | 1 | 2 | 3 |
| 4 | 2 | 2 | 6 | 6 | 1 | 5 | 9 |
| 5 | 1 | 1 | 3 | 3 | 2 | 4 | 5 |
| 6 | 2 | 2 | 2 | 4 | 5 | 6 | 9 |
| 7 | 6 | 6 | 6 | 6 | 1 | 3 | 9 |
Строка 1 без двух пар; строка 2 содержит три пары; строка 3 имеет нужные повторы, но среднее 25 не меньше максимального одиночного 3. В строке 4 среднее повторяющихся равно 4, максимум одиночных — 9.
В шпаргалке для исходного файла указан первый подходящий номер 17. В маленьком учебном файле ответ 4.
Количество строк: максимум и три разбиения на пары
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. Считаем весь файл
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 |
|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 10 |
| 2 | 1 | 2 | 3 | 4 |
| 3 | 2 | 3 | 4 | 6 |
| 4 | 1 | 3 | 5 | 7 |
| 5 | 3 | 3 | 3 | 4 |
| 6 | 1 | 1 | 1 | 3 |
| 7 | 2 | 2 | 4 | 4 |
| 8 | 2 | 4 | 5 | 8 |
Строка 1 не проходит проверку максимума: 10 < 6 ложно. Строка 2 даёт равные пары 1 + 4 = 2 + 3. Строка 3 подходит: 6 < 9 и ни одно из трёх разбиений не даёт равенства. Строка 5 с повторяющимися тройками тоже подходит.
Для исходного файла в шпаргалке указан ответ 2354. Учебный CSV содержит только восемь строк и даёт ответ 3.
Разбери строку по условиям выбранного типа
Выбери тип и введи одну строку натуральных чисел через точку с запятой. Тренажёр покажет частоты, состав списков, сравнения или все три разбиения на пары.
Тренажёр проверяет одну строку. Её номер и то, была ли она первой подходящей, можно узнать только при просмотре файла сверху вниз.
Три программы с пропусками и практика с файлами
Скачай учебный архив и распакуй его. В корне находятся practice1.csv, practice2.csv и practice3.csv. В этих задачах условия знакомые, а данные новые. Собери код, запусти его из папки с CSV и введи полученный результат.
«Проверить строки» сверяет выражения с шаблоном. Страница не запускает введённый Python. Для другого способа решения используй запуск в своём редакторе и проверку числового ответа. После правки можно проверять повторно.
Решено: 0 из 12
Сборка 1. Сумма первой подходящей строки
Показать содержимое practice1.csv
| Строка | Число 1 | Число 2 | Число 3 | Число 4 | Число 5 |
|---|---|---|---|---|---|
| 1 | 4 | 4 | 7 | 8 | 60 |
| 2 | 10 | 20 | 30 | 40 | 50 |
| 3 | 2 | 5 | 6 | 7 | 100 |
| 4 | 1 | 3 | 4 | 5 | 80 |
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()Запусти программу из папки с учебными CSV и проверь ответ ниже.
1. Какой ответ напечатала программа?
Введи одно итоговое число после запуска своего кода.
Сборка 2. Наименьший номер строки с двумя парами
Показать содержимое practice2.csv
| Строка | Число 1 | Число 2 | Число 3 | Число 4 | Число 5 | Число 6 | Число 7 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 2 | 10 | 10 | 20 | 20 | 1 | 2 | 3 |
| 3 | 2 | 2 | 4 | 4 | 6 | 6 | 9 |
| 4 | 6 | 6 | 10 | 10 | 1 | 3 | 8 |
| 5 | 4 | 4 | 8 | 8 | 1 | 7 | 10 |
| 6 | 1 | 1 | 2 | 2 | 3 | 4 | 5 |
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()Запусти программу из папки с учебными CSV и проверь ответ ниже.
2. Какой ответ напечатала программа?
Введи одно итоговое число после запуска своего кода.
Сборка 3. Количество строк без разбиения на равные пары
Показать содержимое practice3.csv
| Строка | Число 1 | Число 2 | Число 3 | Число 4 |
|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 6 |
| 2 | 2 | 3 | 5 | 6 |
| 3 | 4 | 4 | 4 | 5 |
| 4 | 2 | 2 | 2 | 6 |
| 5 | 1 | 4 | 6 | 8 |
| 6 | 5 | 5 | 5 | 6 |
| 7 | 1 | 2 | 4 | 8 |
| 8 | 1 | 2 | 2 | 3 |
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()Запусти программу из папки с учебными CSV и проверь ответ ниже.
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 sequence | Max(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 и напиши весь код самостоятельно. До запуска назови, что является ответом: сумма, номер или количество. После проверки переходи к тренировке на новых файлах.