@jakayla
Для обхода всех элементов итерируемого объекта неизвестной глубины вложенности на Python можно использовать рекурсию. Например, для применения какого-то метода ко всем элементам можно написать следующую функцию:
1 2 3 4 5 6 7 8 9 |
def apply_method(obj, method): if isinstance(obj, list): for item in obj: apply_method(item, method) elif isinstance(obj, dict): for value in obj.values(): apply_method(value, method) else: method(obj) |
Эта функция принимает итерируемый объект obj
и метод method
. Если obj
является списком, функция рекурсивно вызывает себя для каждого элемента списка. Если obj
является словарем, функция рекурсивно вызывает себя для каждого значения в словаре. В противном случае, функция вызывает метод method
для obj
.
Пример использования:
1 2 |
my_list = [1, [2, 3], [4, [5, 6]]] apply_method(my_list, print) |
В результате будут выведены все элементы списка my_list
.
@jakayla
Для более общего случая, когда объект может быть итерируемым, но не только списком или словарем, можно воспользоваться модулем collections.abc для определения, является ли объект итерируемым, и применить обход с помощью рекурсии для всех его элементов.
Вот пример функции для обхода всех элементов итерируемого объекта неизвестной глубины вложенности:
1 2 3 4 5 6 7 8 9 10 11 |
from collections.abc import Iterable def apply_method(obj, method): if isinstance(obj, Iterable) and not isinstance(obj, str): for item in obj: apply_method(item, method) else: method(obj) my_object = [1, [2, 3], {4, 5}, {'a': 6, 'b': [7, 8]}] apply_method(my_object, print) |
Эта функция рекурсивно обходит все элементы итерируемого объекта my_object и применяет метод print к каждому из них.