【问题标题】:Python - Looping through a multidimensional dictionary [duplicate]Python - 循环遍历多维字典[重复]
【发布时间】:2013-08-10 21:36:40
【问题描述】:

如果我解释我认为我在做什么,我希望有人能解释我哪里出错了。

我有以下字典:

ls = [{
    'The Wolf Gift (13)': {
        'cover': 'V:\\Books\\Anne Rice\\The Wolf Gift (13)\\cover.jpg',
        'author': 'Anne Rice',
        'year': '1988'
    },
    'Mummy (14)': {
        'cover': 'V:\\Books\\Anne Rice\\Mummy (14)\\cover.jpg',
        'author': 'Anne Rice',
        'year': '1989'
    },
}]

首先上面是多维字典吗?我想确保我在谈论正确的事情。其次,我如何循环遍历它以检索各个级别的信息。字典是动态填充的,所以我事先不知道键。

我尝试了for book in ls 然后book['cover'] 等。但它似乎不起作用。我需要书名,然后是每本书的附加信息(封面等......)。我对python很陌生。我来自 PHP,使用数组是我的生计,但 python 正在杀死我....

谢谢

【问题讨论】:

  • 你有一个单元素列表,其中包含一个字典,其键是书名,值是另一个字典...
  • @JonClements 感谢您的澄清

标签: python python-2.7


【解决方案1】:

如果ls 包含多个字典,则可以使用她的示例。

for dic in ls:
    for key in dic:
        print 'Book Name: %s' % (key)
        for value in dic[key]:
            print '\t%s: %s' % (value, dic[key][value])

这将产生以下输出:

Book Name: Mummy (14)
    year: 1989
    cover: V:\Books\Anne Rice\Mummy (14)\cover.jpg
    author: Anne Rice
Book Name: The Wolf Gift (13)
    year: 1988
    cover: V:\Books\Anne Rice\The Wolf Gift (13)\cover.jpg
    author: Anne Rice

或者您可以删除最终的 for 循环并像这样直接访问键:

for dic in ls:
    for key in dic:
        print 'Book Name: %s' % (key)
        print 'Publish Year: %s' % dic[key]['year']

这将给出以下输出:

Book Name: Mummy (14)
Publish Year: 1989
Book Name: The Wolf Gift (13)
Publish Year: 1988

【讨论】:

    【解决方案2】:

    好的,首先你的字典实际上是一个包含字典的列表(你在它的声明周围有 [] )。这可能是个问题。一旦你知道这一点,就很容易得到你想要的一切。例如:

    for key in ls[0].keys():
         print ls[0][key]
    

    或者,如果您想访问关于每本书的特定详细信息(包含在另一本字典中,位于最外层的字典中):

    for bookKey in ls[0].keys():
         print ls[0][bookKey]['cover']
         print ls[0][bookKey]['author']
         print ls[0][bookKey]['year']
    

    希望这会有所帮助。也许考虑摆脱这个列表,这会让你的生活更轻松(少一个索引使用)。

    【讨论】:

    • 感谢您的清晰解释。你是对的,它是一个包含字典的列表这一事实让我在尝试访问元素时绊倒了......
    • 我想 :) 祝你的项目和 python 好运。这是一种令人愉快的语言(尽管有时相当简单)。
    【解决方案3】:

    ls 是一个包含字典的列表。这个字典包含的键是书,值是字典。所以你可以像这样访问它们:

    for book in ls[0]:
        covername = ls[0][book]['cover']
        print(covername) 
    

    打印:

    V:\Books\Anne Rice\The Wolf Gift (13)\cover.jpg
    V:\Books\Anne Rice\Mummy (14)\cover.jpg
    

    ls[0] 引用列表中的第一个元素

    [book] 是因为 dict 的键正在被迭代

    ['cover'] 是从 [book] 引用的字典中读取的元素

    【讨论】:

      【解决方案4】:

      这是一个包含单个字典的列表。您可以执行以下操作:

      >>> books = ls[0]
      >>> for book, details in books.iteritems():
              print book,'-->', details['cover']
      ...     
      Mummy (14) --> V:\Books\Anne Rice\Mummy (14)\cover.jpg
      The Wolf Gift (13) --> V:\Books\Anne Rice\The Wolf Gift (13)\cover.jpg
      

      【讨论】:

      • 非常好,这对我来说很有意义。出于兴趣,因为我很快就会遇到它。如果是三层深度呢。所以cover 还包含另一个字典front:back: 例如...我将如何循环遍历?
      • @superphonic 在循环内对其进行迭代,执行:for cover,value in details['cover'].items():#do something. 如果您确定details['cover'] 的键,那么您也可以直接访问它们:details['cover']['front']...
      • 太棒了。正是我想要的。干杯...
      猜你喜欢
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2022-09-22
      • 2019-01-16
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多