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)]