№9
Повторяющиеся и неповторяющиеся числа
Обработка числовой последовательности
Типичный вопрос в задании №9 — как найти повторяющиеся и неповторяющиеся числа строки?
Для этого можно для каждого из чисел в строке проверить отдельно, сколько оно раз встречается в строке.
В обычном решении №9 на Python мы проходимся по каждой строке из файла, преобразуя строку в список из целых чисел. Так пусть все наши числа из строки сейчас лежат в списке data.
Неповторяющиеся числа
В этом случае найти неповторяющиеся числа строки (то есть те числа, которые встречаются единожды - уникальны) можно так:
not_repeat = [num for num in data if data.count(num) == 1]
Создается путем генерации список repeat, который будет содержать в себе теперь только те числа, которые в строке встречались единожды. Мы проходим по каждому числу в строке отдельно и проверяем с помощью метода count, сколько раз это число встречается во всей строке (в исходном списке). Если это число встречается 1 раз - значит, оно уникальное, то есть не повторяется. Развернутая запись выглядит так:
not_repeat = []
for num in data:
if data.count(num) == 1:
not_repeat.append(num)
Повторяющиеся числа
Чтобы найти повторяющиеся числа нужно прежде понять, волнует ли нас количество повторений. Если нам неважно, сколько раз число повторяется, а нужно просто понять, повторяется оно или нет (хотя бы 1 раз или больше), тогда достаточно проверить, что в строке оно встречается больше 1 раза. Это будет выглядеть так:
repeat = [num for num in data if data.count(num) > 1]
Если же нас интересует конкретное количество повторений, тогда пропишем его в отборе. Пусть нужно найти числа, которые повторяются ровно 2 раза:
repeat = [num for num in data if data.count(num) == 2]
Типичные вопросы
- В строке ровно 3 числа не повторяются:
not_repeat = [num for num in data if data.count(num) == 1]
if len(not_repeat) == 3:
# да, в списке не повторяются ровно 3 числа, условие выполняется
- В строке ровно одно число повторяется дважды, остальные числа различны:
repeat = [num for num in data if data.count(num) == 2]
if len(repeat) == 2 and len(not_repeat) == len(data) - len(repeat):
# да, ровно 2 числа повторяются, причем остальные числа не повторяются
- В строке два числа повторяются трижды, остальные числа различны:
repeat = [num for num in data if data.count(num) == 3]
if len(repeat) == 6 and len(not_repeat) == len(data) - len(repeat):
# да, ровно 2 числа повторяются трижды, причем остальные числа не повторяются
Почему мы проверяем len(repeat) == 6, если чисел должно быть 2? - каждое из двух чисел повторяется трижды, отсюда и получается 2 * 3 = 6.
Выводы
Таким образом можно в Python разбивать числа по группам и легко проверять количество повторяющихся и неповторяющихся. Не забывайте еще и про set() - множества. Если нужно проверить, чтобы все числа в строке были различны, тогда можно воспользоваться проверкой через множество: