Я пытаюсь сделать функцию перекрытия в питоне, который принимает любую итерацию, ИНТ п, а ИНТ м (чье значение по умолчанию равно 1), как параметры, и производить листы п значений:внахлест итерируемых с заданным п и т без LEN() использовать
- Первый список содержит первые п значения;
- Каждый последующий список капель первый м из предыдущего списка
- Добавляет следующий м значения из итератора, пока не меньше, чем п значения для занесения в возвращаемом списке.
Пример:
for i in overlap('abcdefghijk',4,2):
print(i,end=' ')
Его выход ['a','b','c','d']
, ['c','d','e','f']
, ['e','f','g','h']
и ['g','h',i','j']
для n=4
и m=2
. В этом случае, если функция выглядит примерно так:
def overlap(iterable, n, m=1)
Как это можно сделать? Основная проблема, с которой я столкнулся, заключается в том, как остановиться, когда есть меньше n значений.
Текущий код: кредиты anmol_uppal's solution.
def hide(iterable):
for v in iterable:
yield v
def overlap(word, n, m):
start = 0
while(start+n < len(word)):
yield list(word[start:start+n])
start += m
if __name__ == '__main__':
for i in overlap('abcdefghijk',3,2):
print(i, end=' ')
print()
for i in overlap(hide('abcdefghijk'),3,2):
print(i, end=' ')
print()
Но проблема в том, что мы не можем использовать len()
с генераторами.
Я попробовал этот код, но я не знаю, почему это дает неожиданные результаты для второго теста
def hide(iterable):
for v in iterable:
yield v
def window(seq, size, step=1):
iters = [iter(seq) for i in range(size)]
[next(iters[i]) for j in range(size) for i in range(-1, -j-1, -1)]
while(True):
yield [next(i) for i in iters]
[next(i) for i in iters for j in range(step-1)]
if __name__ == '__main__':
for i in window('abcdefghijk', 3, 2):
print(i, end=' ')
print()
for i in window(hide('abcdefghijk'), 3, 2):
print(i, end=' ')
print()
@jonrsharpe Пожалуйста, проверьте наличие проблемы. Его не дублируют – Hacker688
@Steven Rumbalski Удалите повторяющийся тег, поскольку проблема не дублируется. – Hacker688
Почему вы используете 'hide()' его ничего особенного? – ZdaR