Поиск ключа во вложенном словаре - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь найти ключ во вложенном словаре:

mydict = {
    ('Geography', 1): {},
    ('Languages', 2): {
        ('English', 3): {
            ('Grammar', 6): {
                ('new', 10):{},
                ('old', 11): {}
            }
        },
        ('Spanish', 4): {},
        ('French', 5):  {
            ('Grammar', 7): {}
        },
        ('Dutch', 8): {
            ('Grammar', 9): {
                ('new', 12):{}
            }
        }
    }
}

Итак, я l oop внутри словаря, чтобы найти ключ ('Grammar', 9), например:

def _loop(topic, topics_dict):
    if (topic[0], topic[1]) in topics_dict.keys():
        return topics_dict[(topic[0], topic[1])]
    else:
        for k, v in topics_dict.items():
            if v != {}:
                return _loop(topic, v)

topic = ('Grammar', 9)
trim_mydict = _loop(topic, mydict)
print(trim_mydict)

Но на самом деле он возвращает None вместо {('new', 12):{}}

Я проверил эту ветку ( Рекурсивный поиск ключа в словаре ), но, похоже, делать то же самое ...

1 Ответ

1 голос
/ 28 мая 2020

Когда у вас есть return без условия в l oop, он возвращает только первый результат, даже если это None. Я добавил такой чек:

mydict = {
    ('Geography', 1): {},
    ('Languages', 2): {
        ('English', 3): {
            ('Grammar', 6): {
                ('new', 10):{},
                ('old', 11): {}
            }
        },
        ('Spanish', 4): {},
        ('French', 5):  {
            ('Grammar', 7): {}
        },
        ('Dutch', 8): {
            ('Grammar', 9): {
                ('new', 10):{}
            }
        }
    }
}


def _loop(topic, topics_dict):
    if (topic[0], topic[1]) in topics_dict.keys():
        return topics_dict[(topic[0], topic[1])]
    else:
        for k, v in topics_dict.items():
            if v != {}:
                if (result := _loop(topic, v)) is not None:
                    return result

topic = ('Grammar', 9)
trim_mydict = _loop(topic, mydict)
print(trim_mydict)

>>> {('new', 10): {}}
...