Курс№9. Таблицы: обработка строк0%
Теория · номер 9 из 27

Таблицы: обработка строк

Дан файл, в каждой строке несколько чисел. Надо посчитать, сколько строк подходят под условие. Шаблон один и тот же, меняется только проверка в if.

6 разделов~35 минут1 первичный балл
  1. 1Что проверяет номер
  2. 2Главный приём
  3. 3Полное решение
  4. 4Условия бывают разные
  5. 5Вопрос бывает разный
  6. 6Ловушки и домашка
Раздел 1 из 6

Что проверяет номер

Дан файл, txt или ods, и в каждой его строке несколько чисел. Надо посчитать, сколько строк подходят под условие. Иногда просят найти номер строки или сумму.

Условие почти всегда состоит из двух частей: какие числа сколько раз повторяются и что-то посчитать по этим числам.

Подготовка файла

На экзамене файл сначала нужно перенести в текстовый документ:

  1. Открой файл в таблице, выдели всё (Ctrl+A) и скопируй.
  2. В папке со своим .py файлом создай текстовый документ 9.txt и вставь туда.
  3. В коде читай его построчно: for line in open('9.txt').

На сайте учебный 9.txt уже лежит рядом с кодом. Вот он целиком, семь строк:

text
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
Раздел 2 из 6

Главный приём

Из строки делаем список чисел, а дальше применяем два фильтра:

python
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. Попробуй на маленьком примере:

python
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)Сортирует по убыванию
Раздел 3 из 6

Полное решение

Условие: в строке 7 чисел, одно повторяется трижды, остальные четыре разные, а среднее четырёх одиночных не больше числа, которое повторяется трижды. Сколько таких строк?

python
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)

скачать 9.txt

Ответ 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 пустой.

Почему len(p3) == 3

p3 хранит тройку три раза, например [6, 6, 6]. Поэтому проверяем его длину, а само число берём как p3[0].

Попробуй самучебная задача

Сколько строк файла 9.txt содержат число, которое повторяется ровно три раза?

Раздел 4 из 6

Условия бывают разные

Цикл и фильтры остаются теми же, меняется только if.

Квадрат суммы:

python
if len(p3) == 3 and len(np) == 3:
    if sum(p3) ** 2 > sum(np) ** 2:
        count += 1

Максимум встречается один раз:

python
if len(p3) == 3 and len(np) == 4:
    if a.count(max(a)) == 1:
        count += 1

Все числа разные, 2·(max+min) больше остальных (пять чисел):

python
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]:

python
if len(a) == len(set(a)):
    a.sort()
    if 2 * (a[0] + a[1] + a[2]) < a[3] + a[4] + a[5]:
        count += 1

Четыре числа: наибольшее меньше суммы трёх, нельзя разбить на две пары с равными суммами. Три сравнения это все три способа разбить четыре числа на две пары:

python
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 подходят под оба условия: одно число повторяется трижды, остальные четыре разные, и наибольшее число строки встречается один раз?

Раздел 5 из 6

Вопрос бывает разный

Что просятЧто меняем в коде
Сколько строкcount = 0, потом count += 1, в конце print(count)
Наибольший номер строкиn = 0 перед циклом, n += 1 в начале каждого прохода, при выполнении условия last = n, в конце print(last)
Сумма в первой подходящей строкеКогда условие выполнилось, print(sum(a)) и сразу break
Попробуй самучебная задача

Какой наибольший номер у строки файла 9.txt, в которой есть число, повторяющееся ровно три раза? Строки нумеруются с единицы.

Раздел 6 из 6

Ловушки и домашка

ЛовушкаКак не попасться
/ и /// даёт дробь, // целую часть. Для среднего арифметического нужен /
«Целые числа», а не натуральныеМогут быть отрицательные
«Сумма всех повторяющихся чисел»Значение один раз или со всеми повторами? Смотри условие
Числа разделены не пробеломНапример, для ; пиши line.split(';')
В строке не столько чисел, сколько ждёшьПроверь первую строку файла

Домашка

Файлов к этим условиям пока нет, поэтому решать их рано и ответ проверить нельзя. Прочитай условия и для каждого прикинь, каким будет if.

Ещё условия этого вида лежат в разделе «Задания», №9.

Пример и задачи «Попробуй сам» учебные, файл 9.txt придуман нами. Источник условий домашки указан над каждым из них, файлы и проверка ответов появятся позже.