Python:获取与字典中的键关联的所有值,其中值可以是列表或单个项

| 我正在寻找与字典中的键相关联的所有值。有时,键仅包含一个字典,有时则包含字典列表。
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\'}}
  ]    
}
这是我阅读书架上每本书标题的方法。
def print_books(d):
  if(len(d[\'shelf\']) == 1):
    print d[\'shelf\'][\'book\'][\'title\']
  else:
    for book in d[\'shelf\']:
      print book[\'book\'][\'title\']
它可以工作,但看起来并不整洁或Pythonic。 for循环在单值情况下失败,因此在if / else下失败。 您可以对此进行改进吗?     
已邀请:
如果您的代码只有一个包含单个项目的列表(这就是我的想法),则代码将中断,如果您确实无法更改数据结构,则这将更加健壮和合理:
def print_books(d):
    if isinstance(d[\'shelf\'], dict):
        print d[\'shelf\'][\'book\'][\'title\']
    else:
        for book in d[\'shelf\']:
            print book[\'book\'][\'title\']
    
为什么不总是使\'shelf \'映射到元素列表,但是在单元素情况下,它是...单个元素列表?这样一来,您始终可以将每个书架都一样。     
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\']
    
我首先要获得一致的输入,然后即使所有书籍都循环浏览。
def print_books(d):
    books = d[\'shelf\'] if type(d[\'shelf\']) is list else [ d[\'shelf\'] ]
    for book in books:
        print book[\'book\'][\'title\']
我认为这看起来有点整洁和pythonic,尽管有些人可能认为它不如原始代码创建具有一个元素并循环遍历的数组有效。     

要回复问题请先登录注册