Reading from Python dict if key might not be present

Question:

I am very new to Python and parsing data.

I can pull an external JSON feed into a Python dictionary and iterate over the dictionary.

for r in results:
     print r['key_name']

As I walk through the results returned, I am getting an error when a key does not have a value (a value may not always exist for a record). If I print the results, it shows as

'key_name': None, 'next_key':.................

My code breaks on the error. How can I control for a key not having a value?

Any help will be greatly appreciated!

Brock

Asked By: Btibert3

||

Answers:

use has_key() , and that will return true or false

Answered By: TIMEX

The preferred way, when applicable:

for r in results:
     print r.get('key_name')

this will simply print None if key_name is not a key in the dictionary. You can also have a different default value, just pass it as the second argument:

for r in results:
     print r.get('key_name', 'Missing: key_name')

If you want to do something different than using a default value (say, skip the printing completely when the key is absent), then you need a bit more structure, i.e., either:

for r in results:
    if 'key_name' in r:
        print r['key_name']

or

for r in results:
    try: print r['key_name']
    except KeyError: pass

the second one can be faster (if it’s reasonably rare than a key is missing), but the first one appears to be more natural for many people.

Answered By: Alex Martelli

[Updated to remove careless mistake]

You could also do something like this:

for r in (row for row in results if 'a' in row):
    print r['a']

This uses a generator expression to pick “rows” out of “results” where “row” includes the key “a”.

Here’s a little test script:

results = [{'a':True}, {'b':True}, {'a':True}]
for r in (row for row in results if 'a' in row): print r['a']
Answered By: Parand

If possible, use the simplejson library for managing JSON data.

Answered By: Daishiman

There are two straightforward ways of reading from Python dict if key might not be present. for example:

dicty = {'A': 'hello', 'B': 'world'}

  1. The pythonic way to access a key-value pair is:

value = dicty.get('C', 'default value')

  1. The non-pythonic way:

value = dicty['C'] if dicty['C'] else 'default value'

  1. even worse:

try:
value = dicty['C']
except KeyError as ke:
value = 'default value'

Answered By: aidanmelen

You can use the built in function hasattr

key='key_name'
# or loop your keys 

if hasattr(e, key):
  print(e[key])
else:
  print('No key for %s' % key)
Answered By: Evhz

the initial question in this thread is why I wrote the Dictor library, it handles JSON fallback and None values gracefully without needing try/except or If blocks.

Also gives you additional options like ignore upper/lower case,

see,

https://github.com/perfecto25/dictor

Answered By: perfecto25

Taken from https://stackoverflow.com/a/14923509/1265070

id = getattr(myobject, 'id', None)
Answered By: ozma
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.