Python разделяет строку в движущемся окне

У меня есть строка с такими цифрами - digit = "7316717"

Теперь я хочу разбить строку таким образом, чтобы выход был перемещающимся окном из 3 цифр за раз. Поэтому я получаю -

["731", "316", "167", "671", "717"]

Каким будет подход? Прямым способом является включение в цикл и повторение. Но я чувствую, что некоторая встроенная функция строки python может сделать это меньше кода. Знаете ли вы о таком подходе?

Ответ 1

примеры itertools предоставляет функцию window, которая делает именно это:

from itertools import islice
def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result    
    for elem in it:
        result = result[1:] + (elem,)
        yield result

Пример использования:

>>> ["".join(x) for x in window("7316717", 3)]
['731', '316', '167', '671', '717']

Ответ 2

>>> s = "7316717"
>>> [s[i:i+3] for i in range(len(s)-2)]
['731', '316', '167', '671', '717']

Ответ 3

В itertools docs.

Модифицируя его немного для элементов n в группе, я сделал этот код:

from itertools import tee, izip

def window(iterable, n):
    els = tee(iterable, n)
    for i, el in enumerate(els):
        for _ in xrange(i):
            next(el, None)
    return izip(*els)


print(["".join(i) for i in window("2316515618", 3)])

Python 2.7

Ответ 4

digit = "7316717"
digit_sets = [digit[i:i+3] for i in range(len(digit)-2)]