Как найти словарь по значению определённого ключа во вложенном словаре?

Рейтинг: 1Ответов: 3Опубликовано: 21.08.2023

Есть словарь с вложенными словарями:

d = {'result': {'1': {'NAME': 'Саша', 'AGE': 20},
                '2': {'NAME': 'Вася', 'AGE': 30}
                }
     }

Необходимо вывести словарь, в котором AGE = 30 То есть:

{'NAME': 'Вася', 'AGE': 30}

Как это сделать? Желательно без for

Ответы

▲ 4Принят

Чтобы из вашего словаря d достать искомый словарь, следует воспользоваться следующей конструкцией:

print(list(filter(lambda v: v["AGE"]==30, d["result"].values()))[0])

Здесь мы фильтруем список значений, полученных из словаря, хранящегося в d["result"]. Для фильтрации используем лямбда-функцию: если у элемента v фильтруемого списка поле "AGE" равно 30, то мы сохраняем этот элемент, иначе - отбрасываем. Полученный отфильтрованный объект переводим в список, используя list(). Из полученного списка достаём нулевой (единственный) элемент, это и будет искомый словарь.

Обратите внимание, что конечный список может содержать несколько элементов, если в исходном словаре d было несколько элементов с "AGE" равным 30. Или, например, конечный список может быть пустым, если в исходном словаре не было элементов, удовлетворяющих условию.

▲ 2

Эта программа работает через цикл for:

for i in d['result'].keys():
    for j in d['result'][i].keys():
        if d['result'][i][j] == 30:
            print(d['result'][i])
            break
▲ 0

pip install jmespath

import jmespath as jp

d = {
    'result': {
        '1': {'NAME': 'Саша', 'AGE': 20},
        '2': {'NAME': 'Вася', 'AGE': 30}
    }
}

# Если Вы уверены, что такой элемент может быть только один, 
# или Вам нужен первый. То что-то такое...
res, *_ = jp.search(
    'result.* | [?AGE==`30`]', d
) or (None,)

# Если список соответсвующих условию то лучше так
res = jp.search(
    'result.* | [?AGE==`30`]', d
)