Btibert3
Btibert3

Reputation: 40146

Reading from Python dict if key might not be present

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

Upvotes: 39

Views: 75145

Answers (8)

ozma
ozma

Reputation: 1803

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

id = getattr(myobject, 'id', None)

Upvotes: 0

perfecto25
perfecto25

Reputation: 842

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

Upvotes: 1

Evhz
Evhz

Reputation: 9246

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)

Upvotes: 0

aidanmelen
aidanmelen

Reputation: 6594

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'

Upvotes: 9

Parand
Parand

Reputation: 106310

[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']

Upvotes: 0

Daishiman
Daishiman

Reputation: 804

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

Upvotes: 1

Alex Martelli
Alex Martelli

Reputation: 881705

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.

Upvotes: 95

TIMEX
TIMEX

Reputation: 271824

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

Upvotes: 0

Related Questions