Search for a key in a nested Python dictionary
Solution 1:
dpath to the rescue.
http://github.com/akesterson/dpath-python
dpath lets you search by globs, which will get you what you want.
$ 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.
It will iterate out all of the conditions in the dictionary, so no special looping constructs required.
See also
- how do i traverse nested dictionaries (python)?
- How to do this - python dictionary traverse and search
- Access nested dictionary items via a list of keys?
- Find all occurrences of a key in nested python dictionaries and lists
- Traverse a nested dictionary and get the path in Python?
- Find all the keys and keys of the keys in a nested dictionary
- Searching for keys in a nested dictionary
- Python: Updating a value in a deeply nested dictionary
- Is there a query language for JSON?
- Chained, nested dict() get calls in python
Solution 2:
You're close.
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
If you need to know how many 11
s there are as keys in the inner dict
s, you can:
idnum = 11
print sum(idnum in idnumber for idnumber in A.itervalues())
This works because a key can only be in each dict
once so you just have to test if the key exits. in
returns True
or False
which are equal to 1
and 0
, so the sum
is the number of occurences of idnum
.