开发者

Python: get all values associated with key in a dictionary, where the values may be a list or a single item

开发者 https://www.devze.com 2023-02-24 21:02 出处:网络
I\'m looking to get all value开发者_如何转开发s associated with a key in a dictionary. Sometimes the key holds a single dictionary, sometimes a list of dictionaries.

I'm looking to get all value开发者_如何转开发s associated with a key in a dictionary. Sometimes the key holds a single dictionary, sometimes a list of dictionaries.

a = {
  'shelf':{
    'book':{'title':'the catcher in the rye', 'author':'j d salinger'}
  }
}  

b = {
  'shelf':[
    {'book':{'title':'kafka on the shore', 'author':'haruki murakami'}},
    {'book':{'title':'atomised', 'author':'michel houellebecq'}}
  ]    
}

Here's my method to read the titles of every book on the shelf.

def print_books(d):
  if(len(d['shelf']) == 1):
    print d['shelf']['book']['title']
  else:
    for book in d['shelf']:
      print book['book']['title']

It works, but doesn't look neat or pythonic. The for loop fails on the single value case, hence the if/else.

Can you improve on this?


Given your code will break if you have a list with a single item (and this is how I think it should be), if you really can't change your data structure this is a bit more robust and logic:

def print_books(d):
    if isinstance(d['shelf'], dict):
        print d['shelf']['book']['title']
    else:
        for book in d['shelf']:
            print book['book']['title']


Why not always make 'shelf' map to a list of elements, but in the single element case it's a ... single element list? Then you'd always be able to treat each bookshelf the same.


def print_books(d):
    container = d['shelf']
    books = container if isinstance(container, list) else [container['book']]
    books = [ e['book'] for e in books ] 
    for book in books:
        print book['title']


I would first get the input consistent, then loop through all the books even if only one.

def print_books(d):
    books = d['shelf'] if type(d['shelf']) is list else [ d['shelf'] ]
    for book in books:
        print book['book']['title']

I think this looks a little neater and pythonic, although some might argue not as efficient as your original code to create an array with one element and loop through it.

0

精彩评论

暂无评论...
验证码 换一张
取 消