1. Введение
В задании 9 нужно обработать электронную таблицу. Каждую строку таблицы проверяют на несколько условий, а затем считают количество подходящих строк.
Главная трудность — точно перевести текст условия в проверки Python: какие числа считаются повторяющимися, сколько их должно быть и какое число нужно сравнить с ними.
Условие примера
Откройте файл электронной таблицы, содержащей в каждой строке семь натуральных чисел.
Определите количество строк таблицы, для чисел которых выполнены оба условия:
- в строке есть ровно три числа, каждое из которых повторяется дважды, и одно число без повторений;
- среднее арифметическое минимального и максимального среди повторяющихся чисел строки меньше неповторяющегося числа.
В ответе запишите только число.
2. Теория и разбор данных
Как устроен файл
Для Python файл можно представить как набор текстовых строк.
Одна строка файла соответствует одной строке таблицы. Внутри неё семь чисел разделены пробелами или знаками табуляции. В конце обычно находится символ перевода строки \n.
Идея решения
Читаем файл по одной строке, превращаем строку в список чисел, проверяем оба условия и увеличиваем счётчик.
Важно о формате
Код с
open()читает текстовый файл. Если данные открываются как таблица, сохраните их в текстовом формате. Файл.xlsxобычнымopen()по строкам не читают.
Что делает open()
open('9')
открывает файл с именем 9 и возвращает файловый объект.
Цикл:
for i in open('9'):
берёт из него одну строку за другой. Переменная i каждый раз содержит текст одной строки.
Важно:
- файл должен лежать в той же папке, где запускается программа, или нужно указать правильный путь;
- имя и расширение должны совпадать: если файл называется
9.txt, нужно написатьopen('9.txt'); - в этой задаче в файле только цифры и разделители, поэтому отдельно указывать кодировку не нужно.
split() и генераторы списков
i.split()
делит строку i по пробелам, табуляции и переводу строки.
Результатом будет список строк str, например:
['14', '8', '14', '21', '8', '35', '21']
Поэтому нужно применить int(j) к каждому фрагменту:
a = [int(j) for j in i.split()]
После этого получим список целых чисел:
[14, 8, 14, 21, 8, 35, 21]
Запись:
[int(j) for j in i.split()]
называется генератором списков, правильнее — списковым включением.
Она создаёт новый список, последовательно обрабатывая все элементы после for.
То же самое обычным циклом:
a = []
for j in i.split():
a.append(int(j))
Генератор списка позволяет записать это короче:
a = [int(j) for j in i.split()]
3. Код на Python и построчный разбор
Полное решение
k = 0
for i in open('9'):
a = [int(j) for j in i.split()]
pov_2 = [j for j in a if a.count(j) == 2]
pov_1 = [j for j in a if a.count(j) == 1]
if len(pov_2) == 6 and len(pov_1) == 1:
if (min(pov_2) + max(pov_2)) / 2 < pov_1[0]:
k += 1
print(k)
Ответ: 3582
Что делает каждая строка
1. Создаём счётчик
k = 0
Создаём счётчик подходящих строк. Пока ни одна строка не проверена, счётчик равен нулю.
2. Перебираем файл
for i in open('9'):
Открываем файл и перебираем его построчно.
На каждой итерации i — это одна строка файла.
3. Превращаем строку в список чисел
a = [int(j) for j in i.split()]
Разделяем строку на семь фрагментов и превращаем каждый из них в int.
Получаем список из семи целых чисел.
4. Находим числа, которые встречаются дважды
pov_2 = [j for j in a if a.count(j) == 2]
Для каждого элемента j проверяем:
a.count(j) == 2
То есть считаем, сколько раз число j встречается во всей строке.
Если ровно два раза, это число добавляется в pov_2.
5. Находим неповторяющееся число
pov_1 = [j for j in a if a.count(j) == 1]
Сохраняем число, которое встречается только один раз.
6. Проверяем структуру повторений
if len(pov_2) == 6 and len(pov_1) == 1:
Нам нужны:
- три разных числа, встречающихся по два раза;
- одно число, встречающееся один раз.
Поэтому в pov_2 должно быть 6 элементов, а в pov_1 — 1.
7. Проверяем второе условие
if (min(pov_2) + max(pov_2)) / 2 < pov_1[0]:
Находим:
- минимальное повторяющееся число;
- максимальное повторяющееся число;
- их среднее арифметическое.
После этого сравниваем результат с единственным неповторяющимся числом.
8. Увеличиваем счётчик
k += 1
Счётчик увеличивается только тогда, когда выполнены оба условия.
В конце:
print(k)
выводит итоговое количество подходящих строк.
Почему повторы дают длину 6
Важно отличать разные значения от их вхождений.
Например, дана строка:
14 8 14 21 8 35 21
Число 14 встречается дважды, поэтому проверку:
a.count(14) == 2
проходят оба числа 14.
То же происходит с 8 и 21.
Поэтому:
pov_2 = [14, 8, 14, 21, 8, 21]
Получается:
3 разных значения × 2 вхождения = 6 элементов
Самих различных повторяющихся значений при этом три.
Дубликаты не мешают функциям min() и max(): минимум и максимум от повторов не изменяются.
4. Практика
Ниже — пять типовых задач. Перед каждым решением отмечен главный нюанс, который нужно перевести из условия в проверку Python.
Не потеряй скобки
Среднее двух чисел считается так:
(min(pov_2) + max(pov_2)) / 2Если убрать скобки, Python сначала разделит только
max(pov_2), и получится другое выражение.
Практика 1. Первая подходящая строка
Источник: Основная волна 2026 (день 1)
Откройте файл электронной таблицы, содержащей в каждой строке пять натуральных чисел.
Определите сумму чисел в строке таблицы с наименьшим номером, содержащей числа, для которых выполнены оба условия:
- в строке все числа различны;
- удвоенная сумма максимального и минимального чисел строки больше суммы оставшихся трёх её чисел.
В ответе запишите только число.
Нюанс задачи
Нужно найти строку с наименьшим номером, поэтому n увеличивается для каждой прочитанной строки.
Как только оба условия выполнены, печатаем номер и сумму, а затем останавливаем перебор командой break.
Решение на Python
n = 0
for i in open('9'):
a = [int(x) for x in i.split()]
n += 1
if len(set(a)) == 5:
if 2 * (max(a) + min(a)) > sum(a) - max(a) - min(a):
print(n, sum(a))
break
Ответ: 1980
Почему len(set(a)) == 5
set(a)
оставляет каждое значение только один раз.
Если после этого в множестве осталось 5 элементов, значит все пять чисел исходной строки различны.