Подтема 3 из 6
Повторы в строке
Как узнать, сколько раз встречается каждое число строки, и проверить условие о повторах.
Частота
Первая проверка задачи темы: в каких строках учебной таблицы одно число повторяется дважды, а остальные четыре различны?
Повторы описывают частотой — сколько раз значение встречается в строке. В строке 2, 2, 5, 5, 5, 9 значение 2 встречается два раза, 5 — три раза, 9 — один раз. «Число встречается дважды» означает два появления всего, включая первое.
Неповторяющиеся числа — с частотой 1: здесь только 9. Повторяющиеся — с частотой больше 1: 2, 2, 5, 5, 5. А различные значения — каждое по одному разу: 2, 5 и 9. «Различные» и «неповторяющиеся» — не одно и то же.
Структура повторов
Условие о повторах задаёт размеры групп одинаковых чисел — их сумма всегда равна длине строки. В строке 4, 4, 4, 7, 7, 2, 9 три четвёрки, две семёрки, одна двойка и одна девятка: структура 3 + 2 + 1 + 1 = 7. Сами значения для структуры не важны:
Задача темы требует структуру 2 + 1 + 1 + 1 + 1: одна пара и четыре одиночных числа. Выбери требование, чтобы увидеть его структуру:
- все шесть чисел различны
- 1 + 1 + 1 + 1 + 1 + 1
- в шести числах одна пара, остальные различны
- 2 + 1 + 1 + 1 + 1
- в шести числах две пары, остальные различны
- 2 + 2 + 1 + 1
- в шести числах одна тройка, остальные различны
- 3 + 1 + 1 + 1
- в семи числах одна тройка и одна пара
- 3 + 2 + 1 + 1
- в семи числах одна четвёрка, остальные различны
- 4 + 1 + 1 + 1
Тонкости:числа различных значений мало
Проверка «в строке пять различных значений» не отличает одну тройку от двух пар:
Число различных значений решает только два случая: если их столько же, сколько чисел, повторов нет; если на одно меньше — ровно одна пара.
Полоса частот
Под каждым числом строки ставят его частоту — получается полоса частот. Структуру проверяют, считая в полосе нужные частоты. У строки 2, 2, 5, 5, 5, 9 полоса 2, 2, 3, 3, 3, 1. Значение с частотой k занимает k ячеек, поэтому одна пара — это две двойки в полосе, а «одна пара и четыре одиночных» — две двойки и четыре единицы.
считает ячейки диапазона, равные значению: =СЧЁТЕСЛИ($A1:$F1; — сколько раз в строке встречается число из A1. Формулу копируют вправо до L1 и вниз: знак $ закрепляет исходные столбцы A–F, а A1 становится B1, C1 и так далее. Так получается в G:L:
=СЧЁТЕСЛИ($A1:$F1; A1)=И(СЧЁТЕСЛИ(G1:L1; 2)=2;СЧЁТЕСЛИ(G1:L1; 1)=4)| A | B | C | D | E | F | G | H | I | J | K | L | M | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 2 | 5 | 7 | 9 | 11 | 2 | 2 | 1 | 1 | 1 | 1 | ИСТИНА |
| 2 | 5 | 5 | 1 | 3 | 7 | 9 | 2 | 2 | 1 | 1 | 1 | 1 | ИСТИНА |
| 3 | 2 | 2 | 5 | 5 | 9 | 11 | 2 | 2 | 2 | 2 | 1 | 1 | ЛОЖЬ |
| 4 | 2 | 2 | 2 | 7 | 9 | 11 | 3 | 3 | 3 | 1 | 1 | 1 | ЛОЖЬ |
| 5 | 3 | 3 | 4 | 5 | 7 | 8 | 2 | 2 | 1 | 1 | 1 | 1 | ИСТИНА |
| 6 | 7 | 7 | 20 | 22 | 24 | 26 | 2 | 2 | 1 | 1 | 1 | 1 | ИСТИНА |
G1скопирована до L6=СЧЁТЕСЛИ($A1:$F1;A1) M1скопирована до M6=И(СЧЁТЕСЛИ(G1:L1;2)=2;СЧЁТЕСЛИ(G1:L1; 1)=4)
Перепечатай одну из пятёрок третьей строки на 4 — вторая пара исчезнет, и проверка даст ИСТИНА. Выбери требование, чтобы увидеть проверку по полосе:
- все числа различны
=МАКС(G1:L1)=1- есть повторяющееся число
=МАКС(G1:L1)>1- одна пара и четыре одиночных
=И(СЧЁТЕСЛИ(G1:L1;2)=2; СЧЁТЕСЛИ(G1:L1; 1)=4) - две пары и два одиночных
=И(СЧЁТЕСЛИ(G1:L1;2)=4; СЧЁТЕСЛИ(G1:L1; 1)=2) - одна тройка и три одиночных
=И(СЧЁТЕСЛИ(G1:L1;3)=3; СЧЁТЕСЛИ(G1:L1; 1)=3)
— сколько раз x встречается в списке a. Включение собирает частоту каждого элемента — ту же полосу, что в таблице, — а count полосы считает в ней двойки и единицы:
a = [2, 2, 5, 5, 5, 9]frequencies = [a.count(x) for x in a]print(frequencies)print(frequencies.count(2), frequencies.count(1))with open("9.txt") as f: for line in f: a = [int(part) for part in line.split()] frequencies = [a.count(x) for x in a] pair = frequencies.count(2) == 2 print(frequencies, pair and frequencies.count(1) == 4)Структура задачи темы — у строк 1, 2, 5 и 6. Третья не подходит из-за второй пары, четвёртая — из-за тройки двоек.
Все числа различны
«Все числа различны» — в полосе одни единицы; в Python строки такой же длины, как сама строка. Множество хранит каждое значение один раз: для 2, 2, 5, 5, 5, 9 это 2, 5 и 9. Если множество короче строки, в ней есть повторы.
Частоту одного конкретного значения проверяют напрямую: «наибольшее число встречается один раз» — частота максимума равна 1.
=МАКС(G1:L1)=1=СЧЁТЕСЛИ(A1:F1;МАКС(A1:F1))=1a = [2, 2, 5, 5, 5, 9]print(len(set(a)), len(a), len(set(a)) == len(a))print(a.count(max(a)) == 1)Тонкости:Counter
из модуля collections хранит частоту каждого различного значения. Отсортированный набор частот и есть структура повторов, записанная по возрастанию: 3 + 2 + 1 + 1 — это [1, 1, 2, 3].
from collections import Countera = [4, 4, 4, 7, 7, 2, 9]print(Counter(a)[4], sorted(Counter(a).values()))Итого
- Частотасколько раз встречается значение; «дважды» — два раза
- Структураразмеры групп; их сумма — длина строки
- Полоса
=СЧЁТЕСЛИ($A1:$F1;,A1) [a.count(x) for x in a] - Пара и четырев полосе две двойки и четыре единицы
- Все различны
=МАКС(G1:L1)=1,len(set(a)) == len(a)
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
print(len(set([3, 1, 3, 1, 2])))?ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Значения и появления
Дана строка 4, 4, 7, 9, 9, 9. Чему равна сумма повторяющихся чисел с учётом всех появлений?
Введите число.
Подсказка
Каждое появление повторяющегося числа входит в сумму.
Решение
Повторяющиеся числа — 4, 4, 9, 9, 9, неповторяющееся — только 7. С учётом всех появлений сумма 4 + 4 + 9 + 9 + 9 = 35; без учёта повторений было бы 4 + 9 = 13.
Решение программой
a = [4, 4, 7, 9, 9, 9]repeated = [x for x in a if a.count(x) > 1]print(sum(repeated))Ответ: 35
Структура 3 + 2 + 1 + 1
В каждой строке таблицы 9-4.xlsx, 9-4.txt записаны семь натуральных чисел. Определи количество строк, в которых одно число встречается трижды, другое — дважды, а остальные два числа различны.
Введите число.
Подсказка
Запиши структуру повторов и посчитай, сколько каких частот должно быть в полосе.
Решение
Нужна структура 3 + 2 + 1 + 1: в полосе частот три тройки, две двойки и две единицы. В программе — sorted(Counter(a).values()) == [1, 1, 2, 3]. Таких строк 100.
Решение программой
from collections import Counter answer = 0with open("9-4.txt") as f: for line in f: a = [int(part) for part in line.split()] if sorted(Counter(a).values()) == [1, 1, 2, 3]: answer += 1print(answer)Ответ: 100
Все числа различны
В каждой строке таблицы 9-2.xlsx, 9-2.txt записаны пять натуральных чисел. Определи количество строк, в которых все числа различны, а удвоенная сумма наибольшего и наименьшего чисел не больше суммы трёх остальных.
Введите число.
Подсказка
Все числа различны, если в строке нет повторов: множество строки такой же длины, как сама строка.
Решение
Все числа различны, если множество строки такой же длины, как строка (в таблице — максимум полосы частот равен 1). Второе условие — 2 · (m + M) ≤ S − m − M. Подходит 73 строки.
Решение программой
answer = 0with open("9-2.txt") as f: for line in f: a = [int(part) for part in line.split()] m = min(a) big = max(a) rest = sum(a) - m - big if len(set(a)) == len(a) and 2 * (m + big) <= rest: answer += 1print(answer)Ответ: 73
Наибольшее число — один раз
В каждой строке таблицы 9-3.xlsx, 9-3.txt записаны шесть натуральных чисел. Определи количество строк, в которых есть повторяющиеся числа, а наибольшее число строки встречается в ней ровно один раз.
Введите число.
Подсказка
Проверь частоту самого наибольшего числа строки.
Решение
Повторы есть, если множество строки короче строки; наибольшее число единственно, если его частота равна 1: a.count(max(a)) == 1. Подходит 395 строк.
Решение программой
answer = 0with open("9-3.txt") as f: for line in f: a = [int(part) for part in line.split()] if len(set(a)) < len(a) and a.count(max(a)) == 1: answer += 1print(answer)Ответ: 395