Это отвечает тому, что должен был задать OP , то есть перебирает список, сравнивающий последовательные элементы (отличный ответ SilentGhost ), но обобщенный для любой группы ( n-грамм ): 2, 3, ... n:
zip(*(l[start:] for start in range(0, n)))
Примеры:
l = range(0, 4) # [0, 1, 2, 3]
list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []
Пояснения:
l[start:] генерирует список / генератор, начиная с индекса start
*listили *generator: передает все элементы в функцию включения, zipкак если бы она была написанаzip(elem1, elem2, ...)
Примечание:
AFAIK, этот код настолько ленив, насколько это возможно. Не проверено.