Рекурсивный метод для печати иерархического словаря - PullRequest
0 голосов
/ 03 октября 2018

Я хочу создать рекурсивный метод с Python, который печатает этот словарь:

partners = {
        'manager-1': {
            'name': 'Manager 1',
            'children': {
                'manager-2': {
                    'name': 'Manager 2',
                    'children': {
                        'employee-1': {
                            'name': 'Employee 1',
                            'children': {
                                'employee-7': {
                                    'name': 'Employee 7',
                                },
                                'employee-8': {
                                    'name': 'Employee 8',
                                }
                            }
                        },
                        'employee-2': {
                            'name': 'Employee 2',
                        },
                        'employee-3': {
                            'name': 'Employee 3',
                        },
                    },
                },
                'manager-3': {
                    'name': 'Manager 3',
                    'children': {
                        'employee-4': {
                            'name': 'Employee 4',
                        },
                        'employee-5': {
                            'name': 'Employee 5',
                        },
                        'employee-6': {
                            'name': 'Employee 6',
                        },
                    },
                },
                'manager-4': {
                    'name': 'Manager 4',
                },
                'manager-5': {
                    'name': 'Manager 5',
                }
            }
        }
    }

И дает его так:

--Manager 1
----Manager 2
------Employee 1
--------Employee 7
--------Employee 8
------Employee 2
------Employee 3
----Manager 3
------Manager 4
------Manager 5
------Manager 6
----Manager 4
----Manager 5

Я сделал этот метод:

def hierarch(partners):
    for partner in partners:
        if 'children' not in partner.keys(): 
            print(partner['name'])
        else:
            hierarch(partner['children'])

И я получил эту ошибку при запуске кода:

AttributeError: 'str' object has no attribute 'keys'

Как мне создать скрипт, который позволит мне распечатать эту иерархию?Я не очень хорош со словарями.Я работаю с Python 3. Любая помощь, пожалуйста?Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы получаете это AttributeError, потому что вы рекурсивно вызываете функцию hierarch для каждого значения 'children'.Это справедливо для таких ключей, как «employee-1», поскольку рекурсивный вызов зацикливается на связанном dict, но не завершается на «name», так как нет связанного dict, только строка имени.

Таким образом, вам нужно протестировать каждый элемент, чтобы убедиться в его правильности.Для этого вы можете использовать функцию type, но рекомендуется использовать более универсальную функцию isinstance.

Вместо того, чтобы печатать нужные имена, мы можем сделать функцию более гибкой, превратив ее в генератор.Таким образом, мы можем перебрать сгенерированные результаты, распечатать их по ходу или выполнить какую-то другую обработку.Или мы можем легко собрать их в список или новый плоский словарь.

partners = {
    'manager-1': {
        'name': 'Manager 1',
        'children': {
            'manager-2': {
                'name': 'Manager 2',
                'children': {
                    'employee-1': {
                        'name': 'Employee 1',
                        'children': {
                            'employee-7': {
                                'name': 'Employee 7',
                            },
                            'employee-8': {
                                'name': 'Employee 8',
                            }
                        }
                    },
                    'employee-2': {
                        'name': 'Employee 2',
                    },
                    'employee-3': {
                        'name': 'Employee 3',
                    },
                },
            },
            'manager-3': {
                'name': 'Manager 3',
                'children': {
                    'employee-4': {
                        'name': 'Employee 4',
                    },
                    'employee-5': {
                        'name': 'Employee 5',
                    },
                    'employee-6': {
                        'name': 'Employee 6',
                    },
                },
            },
            'manager-4': {
                'name': 'Manager 4',
            },
            'manager-5': {
                'name': 'Manager 5',
            }
        }
    }
}

def show(obj, depth=0):
    depth += 1
    for v in obj.values():
        if isinstance(v, dict):
            yield from show(v, depth)
        else:
            yield v, depth

for v, depth in show(partners):
    print('-' * depth + v)   

output

--Manager 1
----Manager 2
------Employee 1
--------Employee 7
--------Employee 8
------Employee 2
------Employee 3
----Manager 3
------Employee 4
------Employee 5
------Employee 6
----Manager 4
----Manager 5
0 голосов
/ 03 октября 2018

Вам нужно воспроизвести точный заказ?Вы можете использовать что-то вроде этого для обхода структуры данных:

def recurse(data, level):
    if type(data) is dict:
        if "name" in data:
            print("-" * level + data["name"])
        for (key, value) in data.items():
            recurse(value, level + 1)
recurse(partners, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...