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

时间:2011-04-13 20:47:08

标签: dictionary key 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。

你能改进吗?

4 个答案:

答案 0 :(得分:5)

如果你有一个包含单个项目的列表,那么你的代码就会中断(这就是我认为它应该是这样的),如果你真的无法改变你的数据结构,那么这将更加健壮和逻辑

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

答案 1 :(得分:3)

为什么不总是将'shelf'映射到元素列表,但在单个元素的情况下,它是一个单元素列表?然后你总是能够对待每个书架。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我首先会得到输入一致,然后循环浏览所有书籍,即使只有一本书。

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,虽然有些人可能认为没有像原始代码那样有效地创建一个包含一个元素的数组并循环遍历它。