Поиск ключа во вложенном словаре Python

У меня есть такие словари Python, как это:

A = {id: {idnumber: condition},.... 

например.

A = {1: {11 : 567.54}, 2: {14 : 123.13}, .....

Мне нужно выполнить поиск, если словарь имеет idnumber == 11, и вычислить что-то с помощью condition. Но если во всем словаре нет idnumber == 11, мне нужно продолжить следующий словарь.

Это моя попытка:

for id, idnumber in A.iteritems():
    if 11 in idnumber.keys(): 
       calculate = ......
    else:
       break

Ответ 1

Вы близко.

idnum = 11
# The loop and 'if' are good
# You just had the 'break' in the wrong place
for id, idnumber in A.iteritems():
    if idnum in idnumber.keys(): # you can skip '.keys()', it the default
       calculate = some_function_of(idnumber[idnum])
       break # if we find it we're done looking - leave the loop
    # otherwise we continue to the next dictionary
else:
    # this is the for loop 'else' clause
    # if we don't find it at all, we end up here
    # because we never broke out of the loop
    calculate = your_default_value
    # or whatever you want to do if you don't find it

Если вам нужно знать, сколько 11 есть в качестве внутренних клавиш dict s, вы можете:

idnum = 11
print sum(idnum in idnumber for idnumber in A.itervalues())

Это работает, потому что ключ может быть только в каждом dict один раз, поэтому вам просто нужно проверить, выходит ли ключ. in возвращает True или False, которые равны 1 и 0, поэтому sum - это количество вхождений idnum.

Ответ 2

dpath для спасения.

http://github.com/akesterson/dpath-python

dpath позволяет искать по глобусам, что даст вам то, что вы хотите.

$ easy_install dpath
>>> for (path, value) in dpath.util.search(MY_DICT, '*/11', yielded=True):
>>> ... # 'value' will contain your condition; now do something with it.

Он выберет все условия в словаре, поэтому никаких специальных циклов не требуется.

См. также