Как обойти все элементы (применить к ним метод) итерируемого объекта неизвестной глубины вложенности на python?

Пользователь

от jakayla , в категории: Python , 2 года назад

Как обойти все элементы (применить к ним метод) итерируемого объекта неизвестной глубины вложенности на python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от sylvester , 2 года назад

@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.

Пользователь

от stanford_mosciski , 9 месяцев назад

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