Reading from Python dict if key might not be present

后端 未结 7 436
清酒与你
清酒与你 2021-01-30 17:10

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:
         


        
相关标签:
7条回答
  • 2021-01-30 17:32

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

    0 讨论(0)
  • 2021-01-30 17:35

    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)
    
    0 讨论(0)
  • 2021-01-30 17:42

    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.

    0 讨论(0)
  • 2021-01-30 17:44

    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

    0 讨论(0)
  • 2021-01-30 17:47

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

    0 讨论(0)
  • 2021-01-30 17:48

    [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']
    
    0 讨论(0)
提交回复
热议问题