Задание №9. Таблица с числами: считаем подходящие строки
Что от тебя хотят
В таблице несколько тысяч строк, в каждой по 5-6 натуральных чисел. Условие вроде «в строке нет повторов, чётных больше, чем нечётных, и сумма чётных меньше суммы нечётных». Надо сказать, сколько строк подходит под все условия сразу.
В Excel это тянется через вспомогательные столбцы. Python делает то же самое за десять строк, и ошибиться в нём сложнее.
Подготовка: таблицу в текст
Открой файл в Excel и сохрани его как «Текст (с разделителями табуляции)» или CSV, назови 9.txt. Положи рядом с программой. Дальше всё через open.
Идея: одна строка за один проход
- Берём строку и превращаем в список чисел:
row = [int(x) for x in line.split()]. - Делим числа на группы ровно так, как просит условие.
- Проверяем условия, и если все выполнены, увеличиваем счётчик.
Условия словами и в коде
| Условие | Код |
|---|---|
| Все числа различны | len(set(row)) == len(row) |
| Чётные числа строки | [x for x in row if x % 2 == 0] |
| Повторяющиеся числа (по всем вхождениям) | [x for x in row if row.count(x) > 1] |
| Неповторяющиеся числа | [x for x in row if row.count(x) == 1] |
| Среднее арифметическое | sum(список) / len(список) |
row.count(x) считает, сколько раз число стоит в строке. Именно по этому числу строка делится на «повторяющиеся» и «одиночки».
sum(...) / len(...) упадёт с ошибкой. Сначала проверь, что в группе есть числа (len(группа) > 0).
Разбор 1: повторяющиеся и одиночки
В каждой строке 6 натуральных чисел. Подсчитайте строки, где выполнены оба условия: в строке есть и повторяющиеся, и неповторяющиеся числа; среднее арифметическое неповторяющихся больше среднего повторяющихся. При вычислении каждое число учитывается столько раз, сколько оно встречается в строке.
В первом окне ниже строка делится на две группы. Условие «есть и те, и другие» превращается в две проверки длины, а «каждое число столько раз, сколько оно встречается» получается само: repeated содержит все вхождения.
Разбор 2: чётность и суммы
В каждой строке 5 натуральных чисел. Подсчитайте строки, где выполнено всё: в строке нет повторяющихся чисел; чётных чисел больше, чем нечётных; сумма чётных меньше суммы нечётных.
Три условия идут через and в одном if. Когда условий много, держи их в одной строке и добавляй по одному: так проще не забыть ни одно.
Разновидности и прототипы задания на экзамене
set.Код решения на Python
Запустить код в онлайн-песочницеcount = 0
for line in open("9.txt"):
row = [int(x) for x in line.split()]
repeated = [x for x in row if row.count(x) > 1]
single = [x for x in row if row.count(x) == 1]
if len(repeated) > 0 and len(single) > 0:
if sum(single) / len(single) > sum(repeated) / len(repeated):
count += 1
print(count)
count = 0
for line in open("9.txt"):
row = [int(x) for x in line.split()]
even = [x for x in row if x % 2 == 0]
odd = [x for x in row if x % 2 == 1]
if len(set(row)) == len(row) and len(even) > len(odd) and sum(even) < sum(odd):
count += 1
print(count)
Типичные ошибки
sum(single) / len(single), когда одиночек в строке нет, даёт ZeroDivisionError.len(single) > 0.[x for x in row if row.count(x) > 1].int(x).for line in open("9.txt").readlines()[1:].ГРОБ №9: Условие про «ровно два» повтора
Бывает так: в строке ровно одна пара одинаковых чисел, а остальные четыре различны. Если проверять только «есть повторы», в счётчик попадут и строки с тройками.
twice = [x for x in row if row.count(x) == 2] и once = [x for x in row if row.count(x) == 1]. Тогда условие записывается как len(twice) == 2 and len(once) == 4.Лайфхаки на экзамене
- Все числа различны:
len(set(row)) == len(row).setвыбрасывает повторы, и длина сразу падает. - Если в файле числа разделены точкой с запятой (CSV), пиши
line.split(";"). - Нужно число, повторяющееся ровно три раза?
[x for x in set(row) if row.count(x) == 3]даст его один раз, без дублей.