Они обеспечивают один шаг вашего списка ввода.
Список значений разрывов для заданной длины:
from itertools import tee, izip
def gapsofsize(iterable, length):
a, b = tee(iterable)
next(b, None)
return ( p for x, y in izip(a, b) if y-x == length+1 for p in xrange(x+1,y) )
print list(gapsofsize([1,2,5,8,9], 2))
[3, 4, 6, 7]
Все значения разрывов:
def gaps(iterable):
a, b = tee(iterable)
next(b, None)
return ( p for x, y in izip(a, b) if y-x > 1 for p in xrange(x+1,y) )
print list(gaps([1,2,4,5,8,9,14]))
[3, 6, 7, 10, 11, 12, 13]
Список разрывов в виде векторов:
def gapsizes(iterable):
a, b = tee(iterable)
next(b, None)
return ( (x+1, y-x-1) for x, y in izip(a, b) if y-x > 1 )
print list(gapsizes([1,2,4,5,8,9,14]))
[(3, 1), (6, 2), (10, 4)]
Обратите внимание, что они являются генераторами и занимают очень мало памяти.Я хотел бы знать, как они работают в вашем тестовом наборе данных.