Как найти ключ словаря? 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}