Вернуть все пути к желаемым ключам в словаре python вместо первого найденного - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь найти все вхождения ключа в словаре. В настоящее время я понял, как создать генератор, который будет печатать только первый, но я не уверен, как вернуть их все в объект или каким-то образом использовать понимание генератора. Как мне вернуть все предполагаемые данные в пригодный для использования объект?


t = {'a': 1,
     'b': {'f': 'asfdsf'},
     'c': 3,
     'd': [
        {'a': 1,
         'b': 2,
         'c': 
            {'e': 1},
         'd': 
            {'e': 55}}],
     'g': 2}

def niah(haystack, needle, path=None):
    if path is None:
        path = []
    if isinstance(haystack, dict):
        if needle in haystack:
            #print(path)
            path.append(needle)
            return(path)
        for k, v in haystack.items():
            result = niah(v, needle, path + [k])
            if result is not None:
                return result
    elif isinstance(haystack, list):
        for idx, v in enumerate(haystack):
            result = niah(v, needle, path + [idx])
            if result is not None:              
                return result

Вывод:

>>> niah(t, 'e'))
['d', 0, 'c', 'e']

Желаемый:

>>> niah(t, 'e'))
[['d', 0, 'c', 'e'], ['d', 0, 'd', 'e']] # or some kind object accessible by iteration, aka generator

Кажется, что путь уступки просто делает генераторы в бесконечном l oop.

1 Ответ

0 голосов
/ 06 мая 2020

Определите глобальную переменную pathlist=[]. и вместо возврата просто pathlist.append(path) (или result, или что-то еще).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...