/
maximalenichev-whoami
/
iterator
Обзор
Документация
Войти
/
maximalenichev-whoami
/
iterator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
flat_iterator.py
145 строк
4 KB
M.Alenichev
Космтичесике правки
16 май 2026, 19:40
16 май 2026, 19:40
4935c60
Код
Авторство
О чём код?
import types # Задание 1: Итератор для списка списков (один уровень) class FlatIterator: def __init__(self, list_of_list): self.list_of_list = list_of_list self.outer_index = 0 self.inner_index = 0 def __iter__(self): return self def __next__(self): if self.outer_index >= len(self.list_of_list): raise StopIteration current_list = self.list_of_list[self.outer_index] if self.inner_index >= len(current_list): self.outer_index += 1 self.inner_index = 0 return self.__next__() item = current_list[self.inner_index] self.inner_index += 1 return item def test_1(): list_of_lists_1 = [ ['a', 'b', 'c'], ['d', 'e', 'f', 'h', False], [1, 2, None] ] for flat_iterator_item, check_item in zip( FlatIterator(list_of_lists_1), ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None] ): assert flat_iterator_item == check_item assert list(FlatIterator(list_of_lists_1)) == ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None] print("test_1 пройден") # Задание 2: Генератор для списка списков (один уровень) def flat_generator(list_of_lists): for sublist in list_of_lists: for item in sublist: yield item def test_2(): list_of_lists_1 = [ ['a', 'b', 'c'], ['d', 'e', 'f', 'h', False], [1, 2, None] ] for flat_iterator_item, check_item in zip( flat_generator(list_of_lists_1), ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None] ): assert flat_iterator_item == check_item assert list(flat_generator(list_of_lists_1)) == ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None] assert isinstance(flat_generator(list_of_lists_1), types.GeneratorType) print("test_2 пройден") # Задание 3*: Итератор с произвольной глубиной вложенности class FlatIteratorDeep: def __init__(self, list_of_list): self.stack = [iter(list_of_list)] def __iter__(self): return self def __next__(self): while self.stack: try: item = next(self.stack[-1]) except StopIteration: self.stack.pop() continue if isinstance(item, list): self.stack.append(iter(item)) else: return item raise StopIteration def test_3(): list_of_lists_2 = [ [['a'], ['b', 'c']], ['d', 'e', [['f'], 'h'], False], [1, 2, None, [[[[['!']]]]], []] ] for flat_iterator_item, check_item in zip( FlatIteratorDeep(list_of_lists_2), ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None, '!'] ): assert flat_iterator_item == check_item assert list(FlatIteratorDeep(list_of_lists_2)) == ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None, '!'] print("test_3 пройден") # Задание 4*: Генератор с произвольной глубиной вложенности def flat_generator_deep(list_of_list): for item in list_of_list: if isinstance(item, list): yield from flat_generator_deep(item) else: yield item def test_4(): list_of_lists_2 = [ [['a'], ['b', 'c']], ['d', 'e', [['f'], 'h'], False], [1, 2, None, [[[[['!']]]]], []] ] for flat_iterator_item, check_item in zip( flat_generator_deep(list_of_lists_2), ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None, '!'] ): assert flat_iterator_item == check_item assert list(flat_generator_deep(list_of_lists_2)) == ['a', 'b', 'c', 'd', 'e', 'f', 'h', False, 1, 2, None, '!'] assert isinstance(flat_generator_deep(list_of_lists_2), types.GeneratorType) print("test_4 пройден") if __name__ == '__main__': test_1() test_2() test_3() test_4() print("Все тесты пройдены!")