№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]

Типичные вопросы

  1. В строке ровно 3 числа не повторяются:

not_repeat = [num for num in data if data.count(num) == 1]

if len(not_repeat) == 3:
    # да, в списке не повторяются ровно 3 числа, условие выполняется
  1. В строке ровно одно число повторяется дважды, остальные числа различны:

repeat = [num for num in data if data.count(num) == 2]
if len(repeat) == 2 and len(not_repeat) == len(data) - len(repeat):
    # да, ровно 2 числа повторяются, причем остальные числа не повторяются

  1. В строке два числа повторяются трижды, остальные числа различны:

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() - множества. Если нужно проверить, чтобы все числа в строке были различны, тогда можно воспользоваться проверкой через множество:

← К списку шпаргалок