Как найти ключ словаря? Python

Например у меня есть словарь

d = {'d': {'a': [{'g': 3}, {'j': 5}]}}

я хочу получить значение ключа j, словарь d может быть разным, поэтому статического пути к ключу j нет. Есть ли способ получать полный путь к ключу? Так же может быть несколько ключей j


Ответы (4 шт):

Автор решения: Maxim Chyorny

Пройдясь циклами for по всему словарю до тех пор пока не найдется ключ j

for _ in list(d):
    for k in d[_]:
        for j in d[_][k]:
            if 'j' in list(j):
                value = j['j']  # 5
                break

print(value)                    # 5
→ Ссылка
Автор решения: Tehnorobot

Попробуйте так:

d = {'d': {'a': [{'g': 3}, {'j': 5}]}}

for key_d, val_d in d['d'].items():
    for val_a in val_d:
        for key, val in val_a.items():
            if key == 'j':
                print(val)
                break

Вывод:

5
→ Ссылка
Автор решения: CrazyElf

Кажется уже были ответы с рекурсивным обходом коллекций тут где-то, но я сходу не нашёл, поэтому написал заново. И я добавил ещё один элемент с ключом j на верхнем уровне, чтобы показать, что таким образом ищутся все вхождения ключа на всех уровнях:

d = {'d': {'a': [{'g': 3}, {'j': 5}]}, 'j': 42}

def find(collection, key):
    if isinstance(collection, dict):
        if key in collection:
            yield collection[key]
        for val in collection.values():
            yield from find(val, key)
    elif isinstance(collection, list):
        for val in collection:
            yield from find(val, key)

for val in find(d, 'j'):
    print(val)

Вывод:

42
5
→ Ссылка
Автор решения: GrAnd

Вот поиск вместе с определением пути.

def find_keys(var, key, path=[]):
    if isinstance(var, dict):
        for k, v in var.items():
            if k == key:
                yield {'path': path+[k], 'value': v}
            if isinstance(v, (dict, list)):
                yield from find_keys(v, key, path+[k])
    elif isinstance(var, list):
        for k, v in enumerate(var):
            yield from find_keys(v, key, path+[k])
            
d = {'d': {'a': [{'g': 3}, {'j': 5}]}, 'x':[[{'y': 7}, {'z': 8}, 2, [{'j': 0}]]]}

print(*[v for v in find_keys(d, 'j')], sep='\n')
{'path': ['d', 'a', 1, 'j'], 'value': 5}
{'path': ['x', 0, 3, 0, 'j'], 'value': 0}
→ Ссылка