Accessing nested values in nested dictionaries in Python 3.3

Question:

I’m writing in Python 3.3.

I have a set of nested dictionaries (shown below) and am trying to search using a key at the lowest level and return each of the values that correspond to the second level.

Patients = {}
Patients['PatA'] = {'c101':'AT', 'c367':'CA', 'c542':'GA'}
Patients['PatB'] = {'c101':'AC', 'c367':'CA', 'c573':'GA'}
Patients['PatC'] = {'c101':'AT', 'c367':'CA', 'c581':'GA'}

I’m trying to use a set of ‘for loops’ to search pull out the value attached to the c101 key in each Pat* dictionary nested under the main Patients dictionary.

This is what I have so far:

pat = 'PatA'
mutations = Patients[pat]

for Pat in Patients.keys(): #iterate over the Pat* dictionaries
    for mut in Pat.keys(): #iterate over the keys in the Pat* dictionaries
        if mut == 'c101': #when the key in a Pat* dictionary matches 'c101'
            print(mut.values()) #print the value attached to the 'c101' key

I get the following error, suggesting that my for loop returns each value as a string and that this can’t then be used as a dictionary key to pull out the value.

Traceback (most recent call last):
File “filename”, line 13, in

for mut in Pat.keys():
AttributeError: ‘str’ object has no attribute ‘keys’

I think I’m missing something obvious to do with the dictionaries class, but I can’t quite tell what it is. I’ve had a look through this question, but I don’t think its quite what I’m asking.

Any advice would be greatly appreciated.

Asked By: s_boardman

||

Answers:

Patients.keys() gives you the list of keys in Patients dictionary (['PatA', 'PatC', 'PatB']) not the list of values hence the error. You can use dict.items to iterate over key: value pairs like this:

for patient, mutations in Patients.items():
    if 'c101' in mutations.keys():
         print(mutations['c101'])

To make your code working:

# Replace keys by value
for Pat in Patients.values():
    # Iterate over keys from Pat dictionary
    for mut in Pat.keys():
        if mut == 'c101':
            # Take value of Pat dictionary using
            # 'c101' as a key
            print(Pat['c101'])

If you want you can create list of mutations in simple one-liner:

[mutations['c101'] for p, mutations in Patients.items() if mutations.get('c101')]
Answered By: zero323
Patients = {}
Patients['PatA'] = {'c101':'AT', 'c367':'CA', 'c542':'GA'}
Patients['PatB'] = {'c101':'AC', 'c367':'CA', 'c573':'GA'}
Patients['PatC'] = {'c101':'AT', 'c367':'CA', 'c581':'GA'}

for keys,values in Patients.iteritems():
   # print keys,values
    for keys1,values1 in values.iteritems():
            if keys1 is 'c101':
                print keys1,values1
                #print values1
Answered By: Abdo Mohsen
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.