Skip to content
Advertisement

Accessing nested dictionary values in python

I am new to Python dictionaries, i’m trying to extract the numbers as positions inside the dictionary value denotations, sub category ‘span’. The dictionary looks like this:

z = {'denotations': [{'id': ['OMIM:254500', 'MESH:D009101', 'BERN:106985601'],
                  'obj': 'disease',
                  'span': {'begin': 96, 'end': 112}},
                 {'id': ['OMIM:254450', 'MESH:D055728', 'BERN:106922101'],
                  'obj': 'disease',
                  'span': {'begin': 266, 'end': 268}},
                 {'id': ['OMIM:254450', 'MESH:D055728', 'BERN:106922101'],
                  'obj': 'disease',
                  'span': {'begin': 351, 'end': 353}}],
 'logits': {'disease': [[{'end': 112,
                          'id': 'OMIM:254500tMESH:D009101tBERN:106985601',
                          'start': 96},
                         0.9999999403953552],
                        [{'end': 268,
                          'id': 'OMIM:254450tMESH:D055728tBERN:106922101',
                          'start': 266},
                         0.9999996423721313],
                        [{'end': 353,
                          'id': 'OMIM:254450tMESH:D055728tBERN:106922101',
                          'start': 351},
                         0.9999995231628418]]}

I’m only interested in the denotations category, more so the numbers held inside span. I can only manage to extract the denotation information print(z["denotations"]) and I’m a bit stuck on how to go further into the dictionary, example:

Is it possible to extract the span information:

print(z['span'])

Output:
'span': {'begin': 96, 'end': 112}},
'span': {'begin': 266, 'end': 268}},
'span': {'begin': 351, 'end': 353}}]

or even store just the numbers as positions?

positions = ([96,112],[266, 268], [351, 353])

Advertisement

Answer

The trick is to recognise that z['denotations'] is a list not a dictionary. Therefore, you need to iterate over this list to access each dictionary containing the spans.

positions = []
for item in z['denotations']:
    positions.append([item['span']['begin'], item['span']['end']])
print(positions)

Output

[[96, 112], [266, 268], [351, 353]]
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement