Как сказал @yatu, использование itertools
, очевидно, лучший способ сделать это.
Но это можно воспроизвести, сжав фрагменты исходного списка. Например, чтобы сгруппировать элементы списка по 3, вы можете сделать:
l = [1, 2, 3, 4, 1, 1, 1, 2, 3, 4]
def groupby3(a_list):
return zip(a_list[:-2], a_list[1:-1], a_list[2:])
print([l for l in groupby3(l)])
# [(1, 2, 3), (2, 3, 4), (3, 4, 1), (4, 1, 1), (1, 1, 1), (1, 1, 2), (1, 2, 3), (2, 3, 4)]
Группировать элементы по любому номеру немного сложнее, так как мы должны динамически строить срез:
l = [1, 2, 3, 4, 1, 1, 1, 2, 3, 4]
def groupbyn(a_list, n):
# computes the bounds of slices to use
bounds = ((start or None, start - n + 1 or None) for start in range(n))
# builds a slice for each generated bounds couple
slices = (slice(start, stop) for start, stop in bounds)
# apply the generated slices
sliced = (a_list[slice] for slice in slices)
# return the sipped slices
return zip(*sliced)
print([l for l in groupbyn(l, 3)])
# [(1, 2, 3), (2, 3, 4), (3, 4, 1), (4, 1, 1), (1, 1, 1), (1, 1, 2), (1, 2, 3), (2, 3, 4)]
print([l for l in groupbyn(l, 2)])
# [(1, 2), (2, 3), (3, 4), (4, 1), (1, 1), (1, 1), (1, 2), (2, 3), (3, 4)]
print([l for l in groupbyn(l, 5)])
# [(1, 2, 3, 4, 1), (2, 3, 4, 1, 1), (3, 4, 1, 1, 1), (4, 1, 1, 1, 2), (1, 1, 1, 2, 3), (1, 1, 2, 3, 4)]
Тогда вы можете использовать эту функцию groupbyn
для решения вашей проблемы:
n = 3
print((1, ) * n in groupbyn(l, n)) # True
n = 4
print((1, ) * n in groupbyn(l, n)) # False