Например:

d = {1:{'name':'x', 'age':24, 'address':{'country':'zzz', 'zip':12345}}, 2:{'name':'y', 'age':21, 'address':{'country':'yyy', 'zip':54321}}, 3:{'name':'z', 'age':25}}

Как мы можем найти оптимизированным способом, что у нас есть максимум 3 слоя (словарь внутри словаря) словаря.

4
dpd 24 Апр 2017 в 14:59

2 ответа

Лучший ответ

Посчитайте 1 для словаря, 0, и еще, и возьмите «худший случай» из всех значений dict:

my_dict = {1:{'name':'x', 'age':24, 'address':{'country':'zzz', 'zip':12345}}, 2:{'name':'y', 'age':21, 'address':{'country':'yyy', 'zip':54321}}, 3:{'name':'z', 'age':25}}

def count(d):
    return max(count(v) if isinstance(v,dict) else 0 for v in d.values()) + 1

print(count(my_dict))

Я получаю 3

4
Jean-François Fabre 24 Апр 2017 в 12:05

Вы можете использовать рекурсивную функцию, чтобы найти максимальную глубину вложенного словаря:

def depth(d):
    if (not isinstance(d, dict) or not d):
        return 0
    else:
        return max(depth(v) for k, v in d.iteritems()) + 1

Это дает ожидаемый результат:

depth(d) # 3

Спасибо @tobias_k за предложение упрощенного подхода.

Обратите внимание, что функция выше дает 0 глубины пустому словарю (вот почему я проверяю if d). Это было полезно для меня в прошлом, но это, скорее всего, соглашение.

1
FLab 24 Апр 2017 в 12:11