Таблицы: обработка строк
Дан файл, в каждой строке несколько чисел. Надо посчитать, сколько строк подходят под условие. Шаблон один и тот же, меняется только проверка в if.
- 1Что проверяет номер
- 2Главный приём
- 3Полное решение
- 4Условия бывают разные
- 5Вопрос бывает разный
- 6Ловушки и домашка
Что проверяет номер
Дан файл, txt или ods, и в каждой его строке несколько чисел. Надо посчитать, сколько строк подходят под условие. Иногда просят найти номер строки или сумму.
Условие почти всегда состоит из двух частей: какие числа сколько раз повторяются и что-то посчитать по этим числам.
Подготовка файла
На экзамене файл сначала нужно перенести в текстовый документ:
- Открой файл в таблице, выдели всё (Ctrl+A) и скопируй.
- В папке со своим
.pyфайлом создай текстовый документ9.txtи вставь туда. - В коде читай его построчно:
for line in open('9.txt').
На сайте учебный 9.txt уже лежит рядом с кодом. Вот он целиком, семь строк:
3 3 3 1 5 8 9 2 2 2 7 4 6 9 4 4 1 1 5 7 8 6 6 6 2 3 4 5 1 2 3 4 5 6 7 9 9 9 1 2 3 4 5 5 5 5 1 2 3
Главный приём
Из строки делаем список чисел, а дальше применяем два фильтра:
a = [int(x) for x in line.split()] p3 = [x for x in a if a.count(x) == 3] # числа, которые повторяются 3 раза np = [x for x in a if a.count(x) == 1] # числа, которые встречаются один раз
a.count(x) говорит, сколько раз x есть в списке a. Попробуй на маленьком примере:
a = [1, 1, 2, 2, 3, 4] print([x for x in a if a.count(x) == 2])
Ещё три записи, которые понадобятся:
| Запись | Что делает |
|---|---|
len(a) == len(set(a)) | Проверяет, что все числа в строке различны |
a.sort() | Сортирует список по возрастанию |
a = sorted(a, reverse=True) | Сортирует по убыванию |
Полное решение
Условие: в строке 7 чисел, одно повторяется трижды, остальные четыре разные, а среднее четырёх одиночных не больше числа, которое повторяется трижды. Сколько таких строк?
count = 0 for line in open('9.txt'): a = [int(x) for x in line.split()] p3 = [x for x in a if a.count(x) == 3] np = [x for x in a if a.count(x) == 1] if len(p3) == 3 and len(np) == 4: if sum(np) / len(np) <= p3[0]: count += 1 print(count)
Ответ 2. Проверим руками: подходят 6 6 6 2 3 4 5, где среднее 3,5 ≤ 6, и 9 9 9 1 2 3 4, где среднее 2,5 ≤ 9. Строка 5 5 5 5 1 2 3 не подходит: пятёрка повторяется 4 раза, и p3 пустой.
p3 хранит тройку три раза, например [6, 6, 6]. Поэтому проверяем его длину, а само число берём как p3[0].
Сколько строк файла 9.txt содержат число, которое повторяется ровно три раза?
count = 0
for line in open('9.txt'):
a = [int(x) for x in line.split()]
p3 = [x for x in a if a.count(x) == 3]
# допиши проверку
print(count)
Условия бывают разные
Цикл и фильтры остаются теми же, меняется только if.
Квадрат суммы:
if len(p3) == 3 and len(np) == 3: if sum(p3) ** 2 > sum(np) ** 2: count += 1
Максимум встречается один раз:
if len(p3) == 3 and len(np) == 4: if a.count(max(a)) == 1: count += 1
Все числа разные, 2·(max+min) больше остальных (пять чисел):
if len(a) == len(set(a)): if 2 * (max(a) + min(a)) > sum(a) - max(a) - min(a): count += 1
Все разные, три наименьших против трёх остальных (шесть чисел). Сначала сортируем, и первые три числа это a[0] + a[1] + a[2]:
if len(a) == len(set(a)): a.sort() if 2 * (a[0] + a[1] + a[2]) < a[3] + a[4] + a[5]: count += 1
Четыре числа: наибольшее меньше суммы трёх, нельзя разбить на две пары с равными суммами. Три сравнения это все три способа разбить четыре числа на две пары:
if max(a) < sum(a) - max(a): if not (a[0] + a[1] == a[2] + a[3] or a[0] + a[2] == a[1] + a[3] or a[0] + a[3] == a[1] + a[2]): count += 1
Числа идут по возрастанию в самой строке: if a == sorted(a):.
Сколько строк файла 9.txt подходят под оба условия: одно число повторяется трижды, остальные четыре разные, и наибольшее число строки встречается один раз?
count = 0
for line in open('9.txt'):
a = [int(x) for x in line.split()]
p3 = [x for x in a if a.count(x) == 3]
np = [x for x in a if a.count(x) == 1]
# допиши проверки
print(count)
Вопрос бывает разный
| Что просят | Что меняем в коде |
|---|---|
| Сколько строк | count = 0, потом count += 1, в конце print(count) |
| Наибольший номер строки | n = 0 перед циклом, n += 1 в начале каждого прохода, при выполнении условия last = n, в конце print(last) |
| Сумма в первой подходящей строке | Когда условие выполнилось, print(sum(a)) и сразу break |
Какой наибольший номер у строки файла 9.txt, в которой есть число, повторяющееся ровно три раза? Строки нумеруются с единицы.
n = 0
for line in open('9.txt'):
n += 1
a = [int(x) for x in line.split()]
p3 = [x for x in a if a.count(x) == 3]
# запоминай номер подходящей строки
print(last)
Ловушки и домашка
| Ловушка | Как не попасться |
|---|---|
/ и // | / даёт дробь, // целую часть. Для среднего арифметического нужен / |
| «Целые числа», а не натуральные | Могут быть отрицательные |
| «Сумма всех повторяющихся чисел» | Значение один раз или со всеми повторами? Смотри условие |
| Числа разделены не пробелом | Например, для ; пиши line.split(';') |
| В строке не столько чисел, сколько ждёшь | Проверь первую строку файла |
Домашка
Файлов к этим условиям пока нет, поэтому решать их рано и ответ проверить нельзя. Прочитай условия и для каждого прикинь, каким будет if.
Ещё условия этого вида лежат в разделе «Задания», №9.
Пример и задачи «Попробуй сам» учебные, файл 9.txt придуман нами. Источник условий домашки указан над каждым из них, файлы и проверка ответов появятся позже.