Итерация по словарю возвращает значение Нет, даже если значение не найдено - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь получить значения из data, но функция ниже всегда дает мне None. Я включил print в l oop, чтобы я действительно мог видеть, что условие правильное, не понимая, почему вместо этого возвращается None. Но печатаемое значение верное.

data = { 
    'test1': { 
        'test1.1': { 
            'a': 'a', 
            'b': 'b' 
        } 
    }, 
    'test2': { 
        'test2.1': { 
            'test2.2': { 
                'c': 'c', 
                'd': 'd' 
            } 
        }, 
        'test_list': [1,2,3] 
    } 
}

def get_dict(key, dict_data): 
    for k, v in dict_data.items(): 
        if k == key and isinstance(v, dict): 
            print(v) 
            return v 
        else: 
            if isinstance(v, dict): 
                return get_dict(key, v) # <-- added return, same result

get_dict('test1', data) возвращает OK

get_dict('test1.1', data) возвращает None, но должно быть {'a': 'a', 'b': 'b'}

get_dict('test2', data) возвращает OK

get_dict('test2.1', data) возвращает None, но должно возвращать {'test2.2': {'c': 'c', 'd': 'd'}}

Ответы [ 2 ]

3 голосов
/ 30 мая 2020

Проблема в том, что вы никогда не дойдете до второго ключа, потому что оба пути возвращаются в вашем коде, и вы никогда не можете получить более одной итерации в l oop. Вам не нужно набирать oop над элементами dict. Просто попробуйте получить доступ к ключу. Если его нет l oop по значениям и рекурсии, возвращая первое, что вы найдете:

data = { 
    'test1': { 
        'test1.1': { 
            'a': 'a', 
            'b': 'b' 
        } 
    }, 
    'test2': { 
        'test2.1': { 
            'test2.2': { 
                'c': 'c', 
                'd': 'd' 
            } 
        }, 
        'test_list': [1,2,3] 
    } 
}

def get_dict(key, dict_data):
    if not isinstance(dict_data, dict):
        return
    try:
        return dict_data[key]   
    except KeyError:
        for v in dict_data.values():
            found = get_dict(key, v)
            if found:
                return found


get_dict('test2.2', data)
# {'c': 'c', 'd': 'd'}

get_dict('test2.1', data)
# {'test2.2': {'c': 'c', 'd': 'd'}}
0 голосов
/ 30 мая 2020

Вам следует продолжить изучение и других диктовок.

Приведенный ниже код не предполагает иерархии:

def get_dict(key, dict_data): 
    for k, v in dict_data.items(): 
        if k == key and isinstance(v, dict): 
            return v 
        elif isinstance(v, dict): 
            ret = get_dict(key, v)
            if ret is not None:
                return ret
    return None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...