[Python] – трюк с groupby

Дана строка текста “bbbbcccABBCcAD”, нужно вернуть список элементов, таких, чтобы у каждого элемента не было одинаковых с ним соседей. При этом нужно сохранить порядок элементов.

Решение:

from itertools import groupby
print([u for (u, _) in groupby(‘bbbbcccABBCcAD’)]) # -> [‘b’, ‘c’, ‘A’, ‘B’, ‘C’, ‘c’, ‘A’, ‘D’]

Объяснение:

Если бы я раньше получил такую задачку, то попробовал бы использовать множество set(). Но в множестве нет сохранения порядка элементов, и фильтрация идёт на уникальность всех элементов, а не только соседних. С другой стороны, itertools.groupby() принимает на вход любой объект-массив iterable, находит в нём одинаковые соседние элементы и возвращает их в кортеже (элемент, код группировки). Код группировки выкидываем (присвоив его бросовой переменной _), получаем искомый список.

Leave a Reply

Your email address will not be published. Required fields are marked *