Поиск ключа во вложенном словаре Python - PullRequest
5 голосов
/ 07 октября 2011

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

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

например

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 12 мая 2013

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.

Это будет повторятьсявсе условия в словаре, поэтому специальные циклические конструкции не требуются.

См. также

5 голосов
/ 07 октября 2011

Ты рядом.

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's 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's '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 s есть ключей во внутренних dict s, вы можете:

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

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

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