@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 к каждому из них.