Как можно переделать код с itertools на обычный код без import и сделать функцию через yield(Питон)
Есть код
from itertools import chain, cycle, compress
def generate_step(a, *steps):
selections = chain.from_iterable(
[0] * (step - 1) + [1] for step in cycle(steps)
)
return compress(a, selections)
a = [1, 2, 3, 4, 5, 6, 7]
b = generate_step(a, 1, 2)
print(next(b))
print(next(b))
print(next(b))
print(next(b))
print(next(b))
Вывод:
1
3
4
6
7
Он работает, но мне нужно, чтобы он работал без использования import.
В моём коде это не генератор, потому что нет yield, мне также нужно, чтобы в переработанном коде был yield вместо return. И соответственно в конце нельзя выходить за границу списка.
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Как-то так:
def generate_step(a, *steps):
i = 0 # начинаем с первого элемента
step_index = 1 # начинаем с шага2, не очень логично,
# но так указано в примере
while i < len(a): # пока не закончатся элементы во входном списке
yield a[i] # генерируем текущий элемент
i += steps[step_index] # переходим к следующему элементу
step_index = (step_index + 1) % len(steps) # переходим к следующему шагу