Python:从字典中获取与键相关的所有值,值可为列表或单个项

1 投票
4 回答
7220 浏览
提问于 2025-04-16 15:41

我想获取字典中与某个键相关的所有值。有时候这个键对应的是一个单独的字典,有时候是一个字典的列表。

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

这个方法能用,但看起来不太整洁,也不够符合Python的风格。因为在处理单个值的情况下,for循环会出错,所以我才用了if/else来处理。

你能帮我改进一下吗?

相关问题:

4 个回答

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

为什么不总是把“书架”映射成一个元素的列表呢?即使只有一个元素的情况下,也把它当作一个包含单个元素的列表?这样的话,你就可以始终以相同的方式对待每个书架了。

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

撰写回答