Вы можете использовать itertools.groupby
:
from itertools import groupby
def any_side_by_side(iterable):
for k, group in groupby(iterable):
next(group) # discard first group element
try:
next(group) # is there a second element?
return True
except StopIteration:
pass
return False
Более короткий, но менее эффективный способ памяти будет
any(len(list(group)) > 1 for k, group in groupby(iterable))
Демонстрация:
>>> any_side_by_side(['A', 'B', 'B', 'A'])
True
>>> any_side_by_side(['B', 'A', 'B', 'A'])
False
Приведенная выше функция вернет True
, если в вашем списке есть последовательность повторяющихся элементов, False
в противном случае.
Другой вариант - рецепт pairwise
изitertools
документы.Вы можете скопировать или вставить его или импортировать из more_itertools
.
>>> from more_itertools import pairwise
>>>
>>> any(x == y for x,y in pairwise(['A', 'B', 'B', 'A']))
True
>>> any(x == y for x,y in pairwise(['B', 'A', 'B', 'A']))
False
Оба эти решения будут работать для любых итеративных, а не только списков.Они также не создают промежуточные списки в памяти, которые не нужны.